1142 단어
6 분
Docker 볼륨으로 컨테이너 데이터 영속성 문제 해결하기
2025-04-23

Docker 컨테이너의 문제#

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

Docker volume이란?#

도커의 볼륨이란 도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법이다. 컨테이너 자체 저장 공간을 사용하지 않고, 호스트 자체의 저장 공간을 공유해서 사용하는 방법이다.

user_count

volume 적용하기#

volume 없이 mysql 컨테이너 실행

docker run -e MYSQL_ROOT_PASSWORD=1234 -p 3308:3306 -d mysql

기존에는 위 명령어로 mysql 컨테이너를 생성하고 실행하였고 볼륨을 사용하는 과정은 다음과 같다.

1. Mysql 데이터를 저장하고 싶은 폴더 생성#

user_count

먼저 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 폴더에 영구적으로 저장된다.

user_count

https://hub.docker.com/_/mysql

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

user_count

docker ps 명령어로 mysql 컨테이너가 실행 중인 것을 확인할 수 있다.

3. MySQL 컨테이너 접속해서 데이터베이스 생성#

user_count

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

user_count

create database mark_database로 데이터베이스 생성한다.

4. MySQL 컨테이너 종료 후 다시 생성하기#

user_count

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

user_count

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

user_count

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

user_count

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

주의해야 할 점#

user_count

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

user_count

디렉토리가 존재하지 않아야 호스트의 디렉터리 절대 경로에 디렉터리를 새로 만들고 컨테이너의 디렉터리에 있는 파일들을 호스트의 디렉터리로 복사한다.

깨달은 점 및 성과#

Docker가 컨테이너를 통째로 교체하는 방식으로 데이터가 손실하는 문제Docker 볼륨(-v 옵션)을 활용해 호스트 시스템과 컨테이너 간 데이터 디렉토리를 연결함으로써 해결했다. 컨테이너가 삭제되거나 업데이트되더라도 MySQL의 중요한 데이터는 호스트 시스템에 안전하게 보존되어 데이터 손실 걱정 없이 Docker의 장점을 활용할 수 있게 되었다.

Docker 볼륨으로 컨테이너 데이터 영속성 문제 해결하기
저자
Joonyoung Hwang
게시일
2025-04-23