도커 이미지로 컨테이너를 생성하면, 해당 이미지는 읽기 전용이 되고 컨테이너 실행 후 변경 사항만 별도로 저장하는 식으로 컨테이너 정보를 보존한다.
따라서 mysql:5.7 이미지로 컨테이너를 생성하면, 해당 데이터베이스의 실제 내용은 이미지가 아니라 컨테이너가 가지고 있다고 보면 된다.
이 때, 기본적으로 컨테이너를 제거하면 컨테이너 계층에 저장돼있던 데이터베이스 정보도 삭제된다. 이러한 점을 해결하기 위해 컨테이너의 데이터를 영속적 데이터로 활용하는 법이 몇가지 있다. 볼륨을 이용하는 것이다.
볼륨을 이용하는 방법은 아래와 같이 분류할 수 있는데...
docker run -d --name sample_database -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=db \
-v /home/db:/var/lib/mysql mysql:5.7
위 명령어의 의미는 호스트의 /home/db 디렉토리와 도커 컨테이너 내부의 /var/lib/mysql 디렉토리를 공유한다는 의미이다.
/home/db가 실제로 생성돼있지 않더라도 도커는 자동으로 생성한다. (리눅스 기준)
docker stop sample_database
docker rm sample_database
위 명령어로 컨테이너를 제거하더라도, /home/db에 도커 컨테이너 계층의 데이터는 보존된다.
이 때, 이미 호스트 디렉토리에 파일이 존재하면 도커 컨테이너 계층의 데이터로 덮어씌워지므로 주의해야한다.
이미 생성한 컨테이너로부터 공유를 공유받는 개념이다.
docker run -it volume_override -v /home/sample:/home/testdir ${image}
docker run -it --volumes-from volume_override --name volumes_share ${image}
도커 명령어를 이용해 볼륨을 생성하고, 해당 볼륨을 이용하는 개념이다.
docker volume create --name myvolume
docker volume ls
DRIVER VOLUME NAME
local myvolume
위 명령어 처럼, 볼륨을 생성하고 아래와 같이 컨테이너 실행 시 옵션으로 넣어주면 된다.
docker run -it --name mycontainer -v myvolume:/root/ ${image}
도커 명령어를 통해 생성한 볼륨은 내부적으로 호스트의 특정 폴더에 마운팅된다. 즉 1번 방법과 동일한 방법인데, 사용자가 해당 볼륨이 어떤 폴더에서 마운팅되고 있는지 알 필요 없이 이용할 수 있다라는 장점이 있다.
아래 결과를 통해 어디에 저장돼있는지 확인할 수 있다.
docker inspect --type volume myvolume
[
{
"CreatedAt": "2022-05-29T02:12:08Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
"Name": "myvolume",
"Options": {},
"Scope": "local"
}
]