도커 볼륨은 컨테이너의 UFS(union file system)가 아닌 디렉토리로
컨테이너에 바인드 마운틴된(bind mounted) 호스트의 일반 디텍토리를 의미한다.
볼륨 초기설정은 세가지 방법이 존재한다.
■ -v 를 이용한 볼륨 설정
# docker run -i -t --name volume-container -v /data debian /bin/bash root@49340c1e5df1:/#
컨테이너의 내부에 /data 디렉토리가 볼륨으로 만들어짐.
/data 디렉토리 내부의 모든 파일은 볼륨으로 복사.
위치 확인을 위한 호스트에서 docker inspect 을 실행하면 확인 할 수 있음.
# docker inspect -f {{.Mounts}} volume-container [{volume 04605f0875bfd694165292622c72ab21... /var/lib/docker/volumes/04605f0875bfd694165292622c72ab21f09934bc04e6f39ee6440cd8f8992883/_data /data local true }]
컨테이너의 /data 볼륨은 호스트의 /var/lib/docker/volumes/{컨테이너}/_data 디렉토리로 연결됨.
테스트를 위하여 호스트 에서 volume-test-file 빈 파일을 생성 하였다.
물론, 경로는 /var/lib/docker/volumes/{컨테이너}/_data 에서 생성.
# touch volume-test-file # ls volume-test-file # docker exec -it volume-container bash root@49340c1e5df1:/# cd /data root@49340c1e5df1:/data# ls volume-test-file
반대로 컨테이너 내에서 volume-test-container 빈 파일 생성 하였다.
역시, 경로는 /data/ 에서 생성.
# touch volume-test-container # ls volume-test-container volume-test-file # pwd /var/lib/docker/volumes/04605f0875bfd694165292622c72ab21f09934bc04e6f39ee6440cd8f8992883/_data # ls volume-test-container volume-test-file
이제 우리는 실제 운영중인 오픈소스를 Docker 기반 이미지화를 만들수 있다.
■ Dockerfile 를 이용한 볼륨설정
도커파일에서 VOLUME 설정을 이용한다.
FROM debian:wheezy VOLUME /data
■ -v HOST_DIR:CONTAINER_DIR 를 사용한 볼륨 설정
-v HOST_DIR : CONTAINER_DIR를 명시하여 호스트에서 바인딩하려는 디렉토리를 지정.
# docker run -v /home/adrian/data:/data debian ls /data
호스트의 /home/adrian/data 디렉토리를 컨테이너 의 /data로 마운트 하게 된다.
데이터 공유
-v HOST_DIR:CONTAINER_DIR 은 컨테이너들 간에 파일을 공유할 때 사용할 수 있다.
--volume-from CONTAINER를 사용하면, 역시 컨테이너들 간에 파일을 공유할 수 있다.
또한, --volume-from CONTAINER는 기존 컨테이너 생성된 볼륨도 접근 할수 있다.
# docker run -i -t --name volume1 -v /root/data:/data ubuntu /bin/bash root@177f9aaeab7b:/# cd /data/ root@177f9aaeab7b:/data# touch test-file root@177f9aaeab7b:/data# ls -la total 0 drwxr-xr-x 2 root root 23 Mar 14 06:05 . drwxr-xr-x 1 root root 18 Mar 14 06:05 .. -rw-r--r-- 1 root root 0 Mar 14 06:05 test-file [root@localhost data]# ls test-file [root@localhost data]# docker run -i -t --name volume2 -v /root/data:/data ubuntu /bin/bash root@0e2fba748b30:/# ls /data/ test-file root@0e2fba748b30:/# docker run -i -t --volumes-from volume2 --name volume3 ubuntu /bin/bash root@0e2fba748b30:/# ls /data/ test-file
위와 같이 volume1, volume2, volume3 를 호스트의 /root/data 로부터 연결된다.
죽, 데이터 볼륨 컨테이너에 일반 컨테이너 여러개 연결해도 된다.
여려개의 볼륨을 사용하는 예
# sudo mkdir -p /var/lib/openproject/{pgdata,logs,static} # docker run -d -p 8080:80 --name openproject \ -v /var/lib/openproject/pgdata:/var/lib/postgresql/9.6/main \ -v /var/lib/openproject/logs:/var/log/supervisor \ -v /var/lib/openproject/static:/var/db/openproject \ openproject/community:7
데이터 컨테이너
일반적으로 컨테이너들간의 데이터를 공유하기 위하여,
공유용도로만 사용되는 컨테이너를 데이터 컨테이너(data containers)라 한다.
--volume-from 명령을 통해 간단하게 볼륨을 장착 할수 있다.
다음은 PostgreSQL 데이터베이스용도로만 쓰이는 컨테이너 생성임 ( --volumes-from 을 사용한 컨테이너 추가됨)
# docker run --name dbdata postgres echo "Data-only container for postgres" # docker run -d --volumes-from dbdata --name db1 postgres 09b6cbbc53a7f298ddf07d1f6a7e1ba4c20c3e8d95de3d93862a583f71764c0f