Docker

[Docker] 볼륨(volume) 종류와 사용 방법

블루빔 2023. 11. 15. 12:38

도커 레이어에는 Image layersContainer 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