[Docker] 볼륨(volume) 종류와 사용 방법
도커 레이어에는 Image layers와 Container layer가 있습니다.
Image layers는 Dockerfile이라는 명세서를 기반으로 도커 이미지를 빌드할 때 사용하며 읽기 전용으로 되어있고 컨테이너를 종료하여도 영향이 없습니다.
Container layer는 읽고 쓰기가 가능하며 컨테이너 종료 시 같이 삭제됩니다. 그러므로 컨테이너 볼륨은 컨테이너가 삭제되면 같이 삭제됩니다.
하여 컨테이너가 삭제되어도 볼륨은 삭제되지 않는 수요가 있을 경우 영구적인 볼륨 사용을 위해 아래와 같은 방식으로 사용하여야 합니다.
목차
▶ 호스트 볼륨
▶ 볼륨 컨테이너
▶ 도커 볼륨
▶ 읽기 전용 볼륨 연결
▶ 호스트 볼륨
: 호스트의 디렉터리를 컨테이너의 특정 경로에 마운트 하여 사용할 수 있습니다.
docker run -d --name nginx -v /호스트디렉토리경로:/컨테이너디렉토리경
▶ 볼륨 컨테이너
: 호스트 볼륨을 사용하는 컨테이너(web-volume)를 생성 후 --volumes-from 옵션을 통해 신규로 생성된 컨테이너(nginx01, nginx02)들은 컨테이너(web-volume)의 볼륨을 마운트 하게 build 하여 사용할 수 있습니다.
#!/usr/bin/env sh
#create volume container
docker run -d -it -v $(pwd)/html:/usr/share/nginx/html --name web-volume ubuntu:focal
#create container use web-volume container
docker run -d --name test-nginx01 --volumes-from web-volume -p 80:80 nginx
docker run -d --name test-nginx02 --volumes-from web-volume -p 8080:80 nginx
>> 호스트 경로의 (html) 디렉터리, 볼륨 컨테이너(web-volume)의 (html) 디렉터리, 컨테이너(nginx01, nginx02)의 (html) 디렉터리 안의 파일들은 모두 동일하며 특정 (html) 디렉터리에서 바꾸면 모든 (html) 디렉터리에서 전부 바뀌는 것을 확인할 수 있습니다.
▶ 도커 볼륨
: 도커 볼륨은 호스트에서 /var/lib/docker/volumes/ 경로 하위에 위치하게 됩니다.
♣ 도커 볼륨 생성
docker volume create --name 생성할볼륨네임
>> 호스트의 /var/lib/docker/volumes/ 경로 하위에 db 디렉터리가 생성된 것을 확인할 수 있습니다.
♣ 도커 볼륨 상세 정보 조회
docker volume inspect 볼륨네임
--------------------------------------
[
{
"CreatedAt": "2023-07-25T06:50:31Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/db/_data",
"Name": "db",
"Options": null,
"Scope": "local"
}
]
♣ 도커 볼륨을 사용하여 컨테이너 생성
docker run -d --name test-mysql -e MYSQL_DATABASE=test_database -e MYSQL_ROOT_PASSWORD=test123 -v db:/var/lib/mysql -p 3306:3306 mysql:5.7
▶ 읽기 전용 볼륨 연결
: 볼륨 연결 설정에 :ro 옵션을 통해 읽기 전용 볼륨을 연결할 수 있습니다.
docker run -d -v 호스트디렉토리경로:/컨테이너디렉토리경:ro -p 80:80 --name ro-nginx nginx
>> 마운트 된 컨테이너 디렉터리에서는 쓰기가 deny 되는 것을 확인할 수 있습니다.
(예시)
docker run -d -v $(pwd)/html:/usr/share/nginx/html:ro -p 80:80 --name ro-nginx nginx