답변:
이 VOLUME
명령은 컨테이너 내부에 디렉토리를 마운트 하고 통합 파일 시스템을 우회하여 컨테이너 파일 구조 외부의 호스트 디스크에있는 해당 디렉토리 내에서 작성 또는 편집 된 파일을 저장합니다.
아이디어는 도커 컨테이너간에 볼륨을 공유 할 수 있으며 참조하는 컨테이너 (실행 중이거나 중지 된)가있는 한 계속 유지됩니다.
컨테이너 --volumes-from
를 실행할 때 명령 을 사용하여 다른 컨테이너가 기존 볼륨을 마운트 (컨테이너간에 효과적으로 공유)하도록 할 수 있습니다.
사이의 근본적인 차이 VOLUME
및 -v
이있다 -v
하여 고정 표시기 컨테이너 내부 운영 체제에서 기존 파일을 마운트하고 VOLUME
것 비어있는 새 볼륨 생성 하여 호스트 및 컨테이너 내부에 마운트.
예:
VOLUME /var/lib/mysql
있습니다.some-volume
그리고,
docker run --volumes-from some-volume docker-image-name:tag
some-volume
마운트됩니다./var/lib/mysql
참고 :를 사용 --volumes-from
하면 볼륨 위치에 존재하는 모든 볼륨에 볼륨이 마운트됩니다. 즉,에 물건이 있으면 /var/lib/mysql
볼륨의 내용으로 바뀝니다.
--volumes-from
로 VOLUME
지정한 항목의 상단에 마운트합니다 -v
. 흥미롭게도 컨테이너를 권한 모드 ( docker run --privileged
)로 실행하는 것처럼 보이고 umount
ing /var/lib/mysql
은 빈 디렉토리를 남겨두고 -v
마운트가 a와 충돌 할 때 완전히 무시됩니다 VOLUME
.
named-volume:/path/in/container
. 이름이없는 볼륨에는 이름에 대한 해시가 제공되며 고아 볼륨에 액세스하기 위해 호스트 경로 대신 해시를 제공 할 수 있습니다. :) volume ls
모두 표시하지 않을 수도 docker volume ls -f dangling=true
있습니다. 시도해보십시오 .
다른 사람들이 Docker의 요점을 놓치고 있다고 생각하기 때문에 내 자신의 대답을 추가하겠습니다.
VOLUME
Docker는 특정 디렉토리에 영구 데이터가 포함되어 있음을 Docker에 알리기 때문에 Dockerfile에서 사용 하는 것이 올바른 방법입니다. Docker는 해당 데이터에 대한 볼륨을 생성하고 사용하는 모든 컨테이너를 제거하더라도 삭제하지 않습니다.
또한 통합 파일 시스템을 무시하므로 볼륨은 실제로 공유하는 모든 컨테이너의 올바른 위치에 마운트 된 (읽기 / 쓰기 또는 읽기 전용) 실제 디렉토리입니다.
이제 호스트에서 해당 데이터에 액세스하려면 컨테이너 만 검사하면됩니다.
# docker inspect myapp
[{
.
.
.
"Volumes": {
"/var/www": "/var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6...",
"/var/cache/nginx": "/var/lib/docker/vfs/dir/62499e6b31cb3f7f59bf00d8a16b48d2...",
"/var/log/nginx": "/var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87..."
},
"VolumesRW": {
"/var/www": false,
"/var/cache/nginx": true,
"/var/log/nginx": true
}
}]
내가 일반적으로하는 일은 / srv와 같은 일부 표준 위치에서 심볼릭 링크를 만들어 볼륨에 쉽게 액세스하고 포함 된 데이터를 관리 할 수 있도록하는 것입니다 (관심있는 볼륨에 대해서만).
ln -s /var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6... /srv/myapp-www
ln -s /var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87... /srv/myapp-log
VOLUME은 Dockerfile
다른 컨테이너가 사용할 볼륨을 노출시키는 데 사용됩니다. 예를 Dockerfile
들어 다음과 같이 작성하십시오 .
우분투에서 : 14.04
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
이미지를 빌드하십시오.
$ docker build -t testing_volume .
컨테이너를 실행하십시오 (예 : container1).
$ docker run -it <image-id of above image> bash
이제 (예 : 컨테이너 2)와 같은 볼륨 옵션을 사용하여 다른 컨테이너를 실행하십시오.
$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bash
container1 /myvol
디렉토리의 모든 데이터 를 동일한 위치의 container2로 가져옵니다 .
-v
옵션은 호스트의 컨테이너 디렉토리를 마운트하는 데 사용되는 컨테이너의 런타임에 제공됩니다. 사용하기 간단합니다 . -v
옵션으로 인수를 제공하십시오 <host-path>:<container-path>
. 전체 명령은$ docker run -v <host-path>:<container-path> <image-id>
기본적 VOLUME
및 -v
옵션은 거의 동일하다. 이것은 '컨테이너에 마운트 특정 디렉토리'를 의미합니다. 예를 들어, VOLUME /data
와 -v /data
정확히 같은 의미입니다. 옵션 이 VOLUME /data
있거나 있는 이미지를 실행하면 디렉토리가 컨테이너에 마운트됩니다. 이 디렉토리는 컨테이너에 속하지 않습니다.-v /data
/data
/data
컨테이너에 파일을 추가 한 다음 컨테이너를 새 이미지로 커밋 한다고 상상해보십시오 . 마운트 된 /data
디렉토리가 원래 컨테이너에 속해 있으므로 데이터 디렉토리에 파일이 없습니다 .
$ docker run -it -v /data --name volume ubuntu:14.04 bash
root@2b5e0f2d37cd:/# cd /data
root@2b5e0f2d37cd:/data# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/data# cd /tmp
root@2b5e0f2d37cd:/tmp# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/tmp# exit
exit
$ docker commit volume nacyot/volume
835cfe3d8d159622507ba3256bb1c0b0d6e7c1419ae32751ad0f925c40378945
nacyot $ docker run -it nacyot/volume
root@dbe335c7e64d:/# cd /data
root@dbe335c7e64d:/data# ls
root@dbe335c7e64d:/data# cd /tmp
root@dbe335c7e64d:/tmp# ls
1 2 3 4 5 6 7 8 9
root@dbe335c7e64d:/tmp#
root@dbe335c7e64d:/tmp#
이 마운트 된 디렉토리 /data
는 응용 프로그램에 속하지 않은 데이터를 저장하는 데 사용됩니다. 그리고를 사용하여 컨테이너에 속하지 않는 데이터 디렉토리를 미리 정의 할 수 있습니다 VOLUME
.
Volume
와 -v
옵션 의 차이점은 -v
컨테이너를 시작할 때 옵션을 동적으로 사용할 수 있다는 것 입니다. 이는 일부 디렉토리를 동적으로 마운트 할 수 있음을 의미합니다. 또 다른 차이점은 컨테이너를 사용하여 호스트 디렉토리를 컨테이너에 마운트 할 수 있다는 것입니다-v