Docker 컨테이너의 문제
Docker를 활용해 MySQL 데이터베이스를 구축한 환경에서 새로운 버전의 MySQL 이미지로 업데이트하면서 데이터가 삭제
되었다. 찾아보니 Docker는 기존 컨테이너에서 변경된 부분만 수정하는 것이 아니라, 새로운 컨테이너를 만들어 통째로 교체하는 방식으로 동작한다고 한다. 추후 중요한 데이터베이스 스키마와 중요한 데이터가 모두 날아가지 않게 Volume을 활용해 보고자 한다.
Docker volume이란?
도커의 볼륨이란 도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법
이다. 컨테이너 자체 저장 공간을 사용하지 않고, 호스트 자체의 저장 공간을 공유해서 사용하는 방법이다.

volume 적용하기
volume 없이 mysql 컨테이너 실행
docker run -e MYSQL_ROOT_PASSWORD=1234 -p 3308:3306 -d mysql
기존에는 위 명령어로 mysql 컨테이너를 생성하고 실행하였고 볼륨을 사용하는 과정은 다음과 같다.
1. Mysql 데이터를 저장하고 싶은 폴더 생성

먼저 Mysql 데이터를 저장하고 싶은 폴더 하나를 생성한다. mkdir docker-mysql
, pwd
명령어로 폴더를 생성하고 현재 경로를 확인하자.
2. volume을 사용하여 mysql 컨테이너 실행
docker run -e MYSQL_ROOT_PASSWORD=1234 -p 3308:3306 -v {호스트의 절대경로}/mysql_data:/var/lib/mysql -d mysql
docker run -e MYSQL_ROOT_PASSWORD=1234 -p 3308:3306 -v /home/mark1106/docker-mysql/mysql_data:/var/lib/mysql -d mysql
mkdir
로 생성한 폴더에서 pwd
명령어를 통해 절대경로를 확인하고, 해당 경로를 docker run
명령어의 -v
옵션에 사용했다. 이때 /home/mark1106/docker-mysql/mysql_data
는 호스트의 볼륨 데이터가 저장될 경로이며, 이 경로가 컨테이너 내부의 /var/lib/mysql
과 연결된다.
따라서 MySQL의 데이터는 호스트의 mysql_data
폴더에 영구적으로 저장된다.

https://hub.docker.com/_/mysql
여기서 DB에 관련된 데이터가 저장되는 공간인 /var/lib/mysql
는 Dockerhub MySQL의 공식 문서에 나와있다.

docker ps 명령어로 mysql 컨테이너가 실행 중인 것을 확인할 수 있다.
3. MySQL 컨테이너 접속해서 데이터베이스 생성

먼저 docker exec -it {container id} bash
명령어로 컨테이너 내부에 접속하고 mysql -u root -p
MySQL 서버에 접속한다.

create database mark_database
로 데이터베이스 생성한다.
4. MySQL 컨테이너 종료 후 다시 생성하기

docker stop {container id}
, docker rm {container id}
명령어로 실행중인 도커를 중지 후 삭제한다. 볼륨을 사용하지 않으면 방금 만든 mark_database가 삭제되었을 것이다.

다시 같은 명령어로 mysql 컨테이너를 생성 후 실행해보자.

그대로 mark_database
가 남아있는 것을 확인할 수 있다.

아까 mysql의 /var/lib/mysql
경로를 확인해보면 위와 같은 데이터들이 있고, 호스트 경로 /home/mark1106/docker-mysql/mysql_data
에 데이터가 복사된 것을 확인할 수 있다.
주의해야 할 점

호스트의 디렉토리 절대 경로에 디렉토리가 이미 존재할 경우, 호스트의 디렉터리가 컨테이너의 디렉터리를 덮어씌운다
.

디렉토리가 존재하지 않아야 호스트의 디렉터리 절대 경로에 디렉터리를 새로 만들고 컨테이너의 디렉터리에 있는 파일들을 호스트의 디렉터리로 복사
한다.
깨달은 점 및 성과
Docker가 컨테이너를 통째로 교체하는 방식으로 데이터가 손실하는 문제
를 Docker 볼륨(-v 옵션)을 활용해 호스트 시스템과 컨테이너 간 데이터 디렉토리를 연결함으로써 해결
했다. 컨테이너가 삭제되거나 업데이트되더라도 MySQL의 중요한 데이터는 호스트 시스템에 안전하게 보존되어 데이터 손실 걱정 없이 Docker의 장점을 활용할 수 있게 되었다.