도커 볼륨은 컨테이너의 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로 마운트 하게 된다.


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

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

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


데이터 공유

-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



  • No labels