Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

도커 볼륨은 컨테이너의 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
iconfalse

특정 호스트의 디렉토리가 볼륨에서 사용되는것을 바인드바운팅(bind mounting)이라고 한다.

기술적 모든 볼륨은 바인드되어 마운트 되기 때문에 오해가 있을 수 있다. 

도커가 소유하는 디렉토리안에 숨겨지는것이 아니라 마운트 지점이 명시적으로 나타난다는 것이 다르다.


데이터 공유

-v HOST_DIR:CONTAINER_DIR 은 컨테이너들 간에 파일을 공유할 때 사용할 수 있다.

draw.io Diagram
bordertrue
viewerToolbartrue
fitWindowfalse
diagramName볼륨공유
simpleViewerfalse
width
diagramWidth442
revision1


--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