도커 볼륨
- 도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 저장하여 각 컨테이너의 정보를 보존한다.
- 이미 생성된 이미지는 어떠한 경우로도 변경되지 않으며, 컨테이너 계층에 원래 이미지에서 변경된 파일 시스템 등을 저장한다.
- 이미지에 컨테이너를 실행하기 위한 파일이 들어있고, 컨테이너 계층에는 애플리케션이 실행 중에 생겨나는 데이터가 저장된다.
- 여기에 치명적인 단점이 있는데, 컨테이너가 삭제되면, 해당 데이터 또한 삭제된다.
-
이를 해결하기 위한 벙법 중 하나가 볼륨이다.
- 볼륨 활용 방법
- 호스트와 볼륨을 공유할 수 있다.
- 볼륨 컨테이너를 활용할 수 있다.
- 도커과 관리하는 볼륨을 생성할 수 있다.
- 호스트와 볼륨을 공유함으로써 DB 컨테이너를 삭제해도 데이터는 삭제되지 않도록 설정
- mysql 데이터베이스 컨테이너 실행
$ docker run -d \ --name wordpress_hostvolume \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_DATABASE=wordpress\ -v /home/wordpress_db:/var/lib/mysql \ mysql:5.7
- 워드프레스 웹 서버 컨테이너 실행
$ docker run -d \ -e WORDPRESS_DB_PASSWORD=password\ --name wordpress_hostvolume \ --link wordpressdb_hostvolume:mysql\ -p 80 \ wordpress
- mysql 데이터베이스 컨테이너 실행
- -v /home/wordpress_db:/var/lib/mysql
- 호스트의 /home/wordpress_db 디렉터리 컨테이너의 /var/lib/mysql 디레터리를 공유한다는 뜻
- wordpress_hostvolume 컨테이너를 삭제해도, 컨테이너의 /var/lib/mysql 디렉터리는 호스트의 /home/workpress_db 디렉터리에 완전히 같은 디렉터리로 데이터가 저장되어 있다.
- 호스트의 볼륨 디렉터리는 설정할 때에 존재하지 않으면 생성한다.
- 호스트의 볼류 디렉터리가 설정할 때에 이미 존재하고 있었다면, 하위 데이터를 지우고 연결한 디렉터리의 파일을 가져온다.
볼륨 컨테이너
- 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유
- –volumes_from 옵션을 설정하면 -v 또는 –volume 옵션을 적용한 커테이너의 볼륨 디렉터리를 공유할 수 있다.
- 직접 볼륨을 공유하는 것이 아닌 -v 옵션을 적용한 컨테이너를 통해 공유
$ docker run -i -t \
--name volume_override \
-v /home/wordpress_db:/home/testdir_2 \
alicek106/volume_test
$ docker run -i -t \
--name volumes_from_container \
--volumes-from volume-override \
ubuntu:14.04
- 미리 생성한 volume_override 컨테이너에 볼륨을 공유받는 경우
- 앞에서생성한 volume_override 컨테이너는 /home/testdir_2 디렉터리를 호스트와 공유하고 있으며, 이 컨테이너를 볼류 컨테이너로서 volumes_from_container 컨테이너에 다시 공유한다.
- 여러개의 컨테이너가 동일한 컨테이너에 –volumes-from 옵션을 사용함으로써 볼륨을 공유하여 사용할 수도 있다.
도커 볼륨
- 도커 자체에서 제공하는 볼륨 기능을 활용하여 데이터 보존
- docker volume 명령어로 시작한다.
$ docker volume create --name myvolume $ docker volume ls
- ls 명령에서 driver 가 로컬로 설정되어 있으면 해당 볼륨은 로컬 호스트에 저장되며 도커 엔진에 의해 생성되고 삭제된다.
- -v 옵션을 이용하여 호스트와 볼륨을 공유한다.
[볼륨의 이름]:[컨테이의 공유 디렉터리]
$ docker run -i -t --name myvolume-1 \ -v myvolume:/root/ \ ubuntu:14.0.4
- docker inspect –type volume myvolume 살펴뵉
- driver: 볼륨이 사용하는 드라이버
- label: 볼륨을 구분하는 라벨
- mounpoint: 해당 볼륨이 실제로 호스트의 어디에 저장했는지를 의미
- 도커 볼륨을 생성하지 않아도 -v 옵션을 사용하면 해당 디렉터리에 대한 볼륨을 자동으로 생성한다.
- -v /root
- 도커 볼륨을 사용하고 있는 컨테이너를 삭제해도 볼륨이 자동으로 삭제되지 않는다.
- 사용하지 않는 볼륨을 삭제 하려면 docker volume prune 명령을 하면 된다.
참고, -v 대신 –mount 옵션을 사용할 수 있다.
--mount type=volume,source=myvolume,target=/root
--mount type=bind,source=/home/wordpress_db,target:/home/testdir
stateless vs stateful
- stateless
- 컨테이너가 아닌 외부에 데이터를 저장하고 컨테이너는 그 데이터로 동작하도록 설계하는 것
- 컨테이너 자체는 상태가 없고 상태를 결정하는 데이터는 외부로부터 제공받는다.
- 컨테이너가 삭제돼도 데이터는 보존되므로 스테이트리스한 컨테이너 설계는 도커를 사용할 때 매우 바람직한 설계 방법
- stateful
- 컨테이너가 데이터를 저장하고 있어 상태가 있는 경우
- 스테이트풀한 컨테이너 설계는 컨테이너 자체에서 데이터를 보관하므로 지양하는 것이 좋다.
** 출처: 용찬호님 시작하세요! 도커/쿠버네티스
** 출처: 데브옵스를 위한 쿠버네틱스 강의