[Docker] 도커의 볼륨(Volume) 살펴보기
볼륨이 왜 필요할까?
도커의 이미지는 실행될 서비스의 정보를 읽기 위한 용도로 사용되고, 컨테이너는 이미지를 기반으로 실행되고 있는 서비스의 정보와 변경 사항을 저장하는 용도로 사용된다. 즉, 컨테이너를 삭제하면 컨테이너 계층에 저장되어 있던 DB 정보도 함께 삭제된다. 이를 방지하기 위해 컨테이너의 데이터를 영속적으로 활용할 수 있는 방법이 필요해졌고, 그 중 가장 쉬운 방법이 볼륨을 활용하는 것이다.
1. 호스트와 볼륨 공유
첫번째로 볼륨을 사용하는 방법은 호스트와 볼륨을 공유하는 것이다. 예시로 MySQL DB 컨테이너와 워드프레스 웹 서버 컨테이너를 생성해보겠다.
docker run -d \
--name wordpressdb_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
docker run -v [호스트의 공유 디렉터리]:[컨테이너의 공유 디렉터리]
docker run 명령어에서 -v 옵션을 통해 호스트의 디렉터리와 컨테이너의 디렉터리를 연결해 공유할 수 있다. 만약 호스트에 공유 디렉터리가 생성되지 않았다면 자동 생성된다. 두 디렉터리는 완전히 같은 디렉터리가 되어 컨테이너 디렉터리에 파일이 수정되면 그 수정 내역을 복사해 호스트 디렉터리에 덮어 씌운다. 여러 개의 -v 옵션을 사용하는 것도 가능하다.
2. 볼륨 컨테이너
두 번째 방법은 -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 것이다. /home/testdir_2 디렉터리를 호스트와 공유하는 volume_overide 컨테이너가 있다고 가정하자. --volumes-from 옵션을 통해 볼륨 컨테이너를 다시 생성하려는 컨테이너에 공유할 수 있다.
docker run -i -t \
--name volumes_from_container \
--volumes-from volume_overide \
ubuntu:14:04
docker run --volumes-from [볼륨 컨테이너 이름]
볼륨 컨테이너를 다시 생성하려는 이 컨테이너에 공유한다. -v 옵션보다 데이터를 간접적으로 공유받는 방식이다.
3. 도커 볼륨
마지막 방법은 docker volume 명령어를 사용하는 방법이다. 볼륨을 생성해 여러 번 재사용할 수 있다.
볼륨 생성 및 볼륨 정보 확인
docker volume create --name myvolume
docker volume ls
볼륨을 생성할 때에는 플러그인 드라이버를 설정해 여러 종류의 스토리지 백엔드를 쓸 수 있다. 여기서는 기본적으로 제공되는 드라이버인 local을 사용해 볼륨을 로컬 호스트에 저장하고 도커 엔진에 의해 생성되고 삭제되도록 한다.
볼륨을 사용하는 컨테이너 생성
docker run -i -t --name myvolume_1 \
-v myvolume:/root/ \
ubuntu:14.04
docker run -i -t --name myvolume_2 \
-v myvolume:/root/ \
ubuntu:14.04
볼륨은 디렉터리 하나에 상응하는 단위로 도커 엔진에서 관리한다. 볼륨을 사용하면 호스트에 데이터를 저장해 보존할 수 있다. - v 옵션에서 [볼륨의 이름]:[컨테이너의 공유 디렉터리]로 입력해 볼륨을 설정한다.
stateless 하다
컨테이너가 아닌 외부에 데이터를 저장하고 컨테이너는 그 데이터로 동작하도록 설계하는 것을 stateless하다고 말한다. 컨테이너 자체는 상태가 없고 상태 결정 데이터를 외부로부터 제공받는다. 컨테이너가 삭제되어도 데이터는 보존되므로 도커를 사용할 때 stateless하게 설계하는 것이 매우 바람직하다. 반대로 컨테이너가 데이터를 저장해 상태가 있는 경우를 stateful하다고 말한다.
참고 자료: