Page History
도커 볼륨은 컨테이너의 UFS(union file system)가 아닌 디렉토리로
컨테이너에 바인드 마운틴된(bind mounted) 호스트의 일반 디텍토리를 의미한다.
볼륨 초기설정은 세가지 방법이 존재한다.
■ -v 를 이용한 볼륨 설정
Code Block |
---|
# docker run -i -t --name volume-container -v /data debian /bin/bash root@49340c1e5df1:/# |
컨테이너의 내부에 /data 디렉토리가 볼륨으로 만들어짐.
/data 디렉토리 내부의 모든 파일은 볼륨으로 복사.
위치 확인을 위한 호스트에서 docker inspect 을 실행하면 확인 할 수 있음.
Code Block |
---|
# 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 에서 생성.
Code Block |
---|
# 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/ 에서 생성.
Code Block |
---|
# 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 설정을 이용한다.
Code Block |
---|
FROM debian:wheezy VOLUME /data |
■ -v HOST_DIR:CONTAINER_DIR 를 사용한 볼륨 설정
-v HOST_DIR : CONTAINER_DIR를 명시하여 호스트에서 바인딩하려는 디렉토리를 지정.
Code Block |
---|
# docker run -v /home/adrian/data:/data debian ls /data |
호스트의 /home/adrian/data 디렉토리를 컨테이너 의 /data로 마운트 하게 된다.
Info | ||
---|---|---|
| ||
특정 호스트의 디렉토리가 볼륨에서 사용되는것을 바인드바운팅(bind mounting)이라고 한다. 기술적 모든 볼륨은 바인드되어 마운트 되기 때문에 오해가 있을 수 있다. 도커가 소유하는 디렉토리안에 숨겨지는것이 아니라 마운트 지점이 명시적으로 나타난다는 것이 다르다. |
데이터 공유
-v HOST_DIR:CONTAINER_DIR 은 컨테이너들 간에 파일을 공유할 때 사용할 수 있다.
draw.io Diagram | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
--volume-from CONTAINER를 사용하면, 역시 컨테이너들 간에 파일을 공유할 수 있다.
또한, --volume-from CONTAINER는 기존 컨테이너 생성된 볼륨도 접근 할수 있다.
Code Block |
---|
CONTAINER# IDdocker run -i -t --name volume1 -v IMAGE COMMAND CREATED STATUS PORTS NAMES d663f6448875 debian "ls /data" 19 minutes ago Exited (0) 19 minutes ago dreamy_visvesvaraya eb3d8ef68b60 openproject/community:7 "/usr/src/app/docker..." 20 hours ago Exited (137) 5 hours ago openproject 8dc7e37dd863 nginx "nginx -g 'daemon of..." 22 hours ago Exited (0) 5 hours ago web /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 -iti -h NEWCONTAINERt --volumes-from dreamy_visvesvaraya debianvolume2 --name volume3 ubuntu /bin/bash root@NEWCONTAINERroot@0e2fba748b30:/# ls /data/ |
dreamy_visvesvaraya 현재 실행중인 볼륨을 가지고 있는지 여부와 상관없이 동작하며,
test-file |
위와 같이 volume1, volume2, volume3 를 호스트의 /root/data 로부터 연결된다.
죽, 데이터 볼륨 컨테이너에 일반 컨테이너 여러개 연결해도 된다볼륨에 연결된 컨테이너가 있는한 삭제 되지 않는다.
데이터 컨테이너
일반적으로 컨테이너들간의 데이터를 공유하기 위하여,
공유용도로만 사용되는 컨테이너를 데이터 컨테이너(data containers)라 한다.
--volume-from 명령을 통해 간단하게 볼륨을 장착 할수 있다.
다음은 PostgreSQL 데이터베이스용도로만 쓰이는 컨테이너 생성임 ( --volumes-from 을 사용한 컨테이너 추가됨)
Code Block |
---|
# docker run --name dbdata postgres echo "Data-only container for postgres" # docker run -d --volumes-from dbdata --name db1 postgres 09b6cbbc53a7f298ddf07d1f6a7e1ba4c20c3e8d95de3d93862a583f71764c0f |