B
Codeverse
mysql dockerize(2) - mysql container에 볼륨 설정하기

mysql dockerize(2) - mysql container에 볼륨 설정하기

로컬 환경을 안전하게 보호하기 위해 MySQL을 도커로 격리하여 실행하는 과정을 기록한다.

2021/11/13

지속적으로 사용할 수 있는 DB 만들기

도커 컨테이너는 프로세스가 종료되면 내부에서 일어난 변경사항들이 모두 사라진다. 재부팅을 하거나 컨테이너가 삭제되면, 그동안 생성한 데이터들이 모두 초기화된다. 이를 방지하기 위해 도커는 데이터를 유지할 수 있는 "볼륨" 기능을 제공한다. MySQL 이미지는 이 기능을 내부적으로 사용하고 있어서, 컨테이너를 생성할 때 자동으로 볼륨을 만든다. 하지만 이렇게 만들어진 볼륨은 컨테이너를 삭제하면 함께 사라지기 때문에, 데이터를 별도로 관리하고자 한다.

볼륨

도커 공식 문서에서는 이렇게 설명하고 있다.

Volumes are the preferred mechanism for persisting data generated by and used by Docker containers. While bind mounts are dependent on the directory structure and OS of the host machine, volumes are completely managed by Docker.

볼륨은 데이터 보존을 위한 기본 메커니즘이다. 운영 체제의 디렉토리 구조에 의존하는 Bind mount와 달리, 볼륨은 도커가 자체적으로 관리하기 때문에 실행 중인 운영 체제에 영향을 받지 않는다는 장점이 있다.

볼륨 확인

우선 MySQL 컨테이너에서 기본적으로 생성되는 볼륨을 확인해보자.

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234 -d mysql
e94b0ab7eed5b1d147147ffe5b170d1520ee680f7b3ab7511e4e0fb4fb9a1925

$  docker volume list
DRIVER    VOLUME NAME
local     b97c5432ff0a86802d2cbca69484448f1ecd5c530ddcad7e4b7eea3c6ec2e8c5

docker volume list 명령어로 볼륨 목록을 확인하면, 자동으로 생성된 임의의 해시값이 볼륨 이름으로 나타난다. 이제 컨테이너를 삭제하고 다시 실행해보자.

$ docker stop mysql
mysql

$ docker rm mysql
mysql

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234 -d mysql
456be35825bc8b1b7d2a4494c8b160ab578730f31a625a775abea271b036eae7

$ docker volume list
DRIVER    VOLUME NAME
local     6765f342d98d3f274a0d7c3b137e07e48e9c153764e372707b6d987018498e6d
local     b97c5432ff0a86802d2cbca69484448f1ecd5c530ddcad7e4b7eea3c6ec2e8c5

이전 볼륨이 삭제되지 않고 새로운 볼륨이 생성된 것을 확인할 수 있다. 컨테이너 안에서 데이터를 생성해본 후 다시 컨테이너를 삭제하고 재실행하면, 데이터가 없어져 있음을 확인할 수 있다.

볼륨에 이름 부여하기

컨테이너를 실행할 때 -v {볼륨 이름||로컬 경로}:{컨테이너 안 경로}또는 --volume={볼륨 이름||로컬 경로}:{컨테이너 안 경로} 옵션을 부여하여 볼륨을 직접 설정할 수 있다. mysql 이미지 안에서 볼륨은 /var/lib/mysql에 마운트되므로, 해당 경로와 함께 원하는 볼륨 이름을 지정하면 된다. 아래에서는 mysql-volume이라는 이름으로 설정했다.

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234 -v mysql-volume:/var/lib/mysql -d mysql

이제 볼륨 목록을 다시 확인해보자.

$ docker volume list
DRIVER    VOLUME NAME
local     6765f342d98d3f274a0d7c3b137e07e48e9c153764e372707b6d987018498e6d
local     b97c5432ff0a86802d2cbca69484448f1ecd5c530ddcad7e4b7eea3c6ec2e8c5
local     mysql-volume

mysql-volume이라는 이름의 볼륨이 생성된 것을 확인할 수 있다. 이제 컨테이너를 삭제하더라도, 볼륨을 제거하지 않는 한 동일한 볼륨을 계속 사용할 수 있다.

볼륨 삭제하기

불필요한 볼륨은 삭제할 수 있다. 삭제하는 방법은 다음과 같다.

  1. 컨테이너를 삭제할 때 볼륨도 함께 삭제하는 방법
$ docker rm -v mysql
  1. 볼륨 리스트에서 특정 볼륨을 직접 삭제하는 방법
$ docker volume rm 6765f342d98d3f274a0d7c3b137e07e48e9c153764e372707b6d987018498e6d
  1. 로컬에 생성되어 있지만, 어떤 컨테이너에도 연결되지 않은 "dangling" 상태의 모든 볼륨을 삭제하는 방법
$ docker volume prune
Tagscontainerdockermysqlvolume도커볼륨