-
도커 볼륨(Docker Volume)BackEnd/docker 2022. 3. 6. 12:15반응형
도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 저장해서 각 컨테이너 정보를 보존합니다. 이미 생성된 이미지는 어떠한 경우로도 변경되지 않으며, 컨테이너 계층에 원래 이미지에서 변경된 파일시스템 등을 저장합니다. 도커의 컨테이너는 생성과 삭제가 매우 쉬우므로 실수로 컨테이너를 삭제하면 데이터를 복구할 수 없게 됩니다. 이를 방지하기 위해 컨테이너의 데이터를 영속적(Persistent) 데이터로 활용할 수 있는 방법 중 하나가 도커 볼륨입니다.
호스트 볼륨 공유
이전 예제에서 데이터베이스 컨테이너 생성 시 -v 옵션을 추가하면 됩니다. -v /home/wordpress_db:/var/lib/mysql는 호스트의 /home/wordpress_db 디렉터리와 컨테이너의 /var/lib/mysql 디렉터리(MySQL이 데이터베이스의 데이터를 저장하는 기본 디렉터리)를 공유한다는 뜻입니다. -v 옵션을 통한 호스트 볼륨 공유는 호스트의 디렉터리를 컨테이너의 디렉터리에 마운트합니다.
디렉터리 단위의 공유뿐 아니라 단일 파일 단위의 공유도 가능하며, 동시에 여러 개의 -v 옵션을 쓸 수도 있습니다.
- [호스트의 공유 디렉터리]:[컨테이너의 공유 디렉터리] 형태
$ docker run -d \ --name wordpressdb \ -e MYSQL_ROOT_PASSWORD=wordpress \ -e MYSQL_USER=wordpress \ -e MYSQL_PASSWORD=wordpress \ -e MYSQL_DATABASE=wordpress \ -v /home/wordpress_db:/var/lib/mysql \ mysql:5.7
볼륨 컨테이너
볼륨을 사용하는 두 번째 방법은 -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 것입니다. 컨테이너를 생성할 때 --volumes-from 옵션을 설정하면 -v 또는 -volume 옵션을 적용한 컨테이너의 볼륨 디렉터리를 공유할 수 있습니다. 여러 개의 컨테이너가 동일한 컨테이너에 --volumes-from 옵션을 사용함으로써 볼륨을 공유해 사용할 수도 있습니다. 이러한 구조를 활용하면 호스트에서 볼륨만 공유하고 별도의 역할을 담당하지 않는 '볼륨 컨테이너'로서 활용하는 것도 가능합니다. 즉, 볼륨을 사용하는 컨테이너에 -v 옵션 대신 --volumes-from 옵션을 사용함으로써 볼륨 컨테이너에 연결해 데이터를 간접적으로 공유받는 방식입니다.
$ docker run -i -t \ --name volumes_from_container \ --volumes_from 호스트 볼륨 공유 디렉터리 \ ubuntu:14.04
도커 볼륨
볼륨을 활용하는 세 번째 방법은 docker volume 명령어를 사용하는 것입니다. 볼륨을 생성할 때 플러그인 드라이버를 설정해 여러 종류의 스토리지 백엔드를 쓸 수 있지만 기본적으로 제공되는 드라이버인 local을 사용합니다. 이 볼륨은 로컬 호스트에 저장되며 도커 엔진에 의해 생성되고 삭제됩니다.
docker volume create 명령어로 볼륨을 생성하고 docker volume ls 명령어로 생성된 볼륨을 확인합니다.
$ docker volume create --name myvolume myvolume $ docker volume ls DRIVER VOLUME NAME local myvolume
myvolume 볼륨을 사용하는 컨테이너를 생성합니다. 입력 형식은 [볼륨 이름]:[컨테이너의 공유 디렉터리]입니다.
$ docker run -i -t --name myvolumn_1 \ -v myvolume:/root/ \ ubuntu:14.04 root@29712250229f:/# echo hello, volume! >> /root/volume
/root 디렉터리에 volume 파일을 생성했습니다. myvolume을 사용하는 다른 컨테이너를 생성하고 volume 파일이 존재하는지 확인합니다.
$ docker run -i -t --name myvolume_2 \ -v myvolume:/root/ \ ubuntu:14.04 root@ec4a5b3488a1:/# cat /root/volume hello, volume!
도커 볼륨도 여러 개의 컨테이너에 공유되어 활용될 수 있습니다. 볼륨은 디렉터리 하나에 상응하는 단위로서 도커 엔진에서 관리합니다. docker inspect 명령어를 사용하면 myvolume 볼륨이 실제로 어디에 저장되는지 알 수 있습니다. docker inspect 명령어는 컨테이너, 이미지, 볼륨 등 도커의 모든 구성 단위의 정보를 확인할 때 사용되며, 정보를 확인할 종류를 명시하기 위해 --type 옵션에 image, volume 등을 입력하는 것이 좋습니다.
$ docker inspect --type volume myvolume [ { "CreatedAt": "2022-03-06T02:43:51Z", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/myvolume/_data", "Name": "myvolume", "Options": {}, "Scope": "local" } ]
Note.
도커의 모든 명령어는 docker 접두어 다음에 container, image, volume 등을 명시함으로써 특정 구성 단위를 제어하는 명령어를 사용할 수 있습니다. 예를 들어, docker container inspect는 컨테이너의 정보를, docker volume inspect는 볼륨의 정보를 출력합니다.
도커 볼륨을 사용하고 있는 컨테이너를 삭제해도 볼륨이 자동으로 삭제되지는 않습니다. docker volume ls 명령어로 목록을 확인하고 docker volume rm VOLUME_NAME 명령어로 볼륨을 삭제합니다. 사용되지 않는 볼륨을 한꺼번에 삭제하려면 docker volume prune 명령어를 사용합니다.
이처럼 컨테이너가 아닌 외부에 데이터를 저장하고 컨테이너는 그 데이터로 동작하도록 설계하는 것을 스테이트리스(stateless)하다고 말합니다. 컨테이너 자체는 상태가 없고 상태를 결정하는 데이터는 외부로부터 제공받습니다. 컨테이너가 삭제돼도 데이터는 보존되므로 스테이트리스한 컨테이너 설계는 도커를 사용할 때 매우 바람직한 설계입니다. 이와 반대로 컨테이너가 데이터를 저장하고 있어 상태가 있는 스테이트풀(stateful)한 컨테이너 설계는 지양하는 것이 좋습니다.
반응형'BackEnd > docker' 카테고리의 다른 글
컨테이너 로깅(Container Logging) (0) 2022.03.12 도커 네트워크(Docker Network) (0) 2022.03.09 도커 컨테이너(Docker Container) (0) 2022.03.06 도커 엔진(Docker Engine) (0) 2022.02.26 도커(Docker) (0) 2022.02.26