도커 컨테이너간에 볼륨을 사용하여 폴더를 성공적으로 공유 할 수있었습니다.
docker run -v /host/path:/container/path ...
그러나 내 질문은 이것과 VOLUME
Dockerfile 에서 명령을 사용하는 것의 차이점은 무엇입니까 ?
VOLUME /path
VOLUME
명령 이있는 이미지를 사용하고 있으며 호스트와 공유하는 방법을 알고 싶습니다. 내가 사용하여 수행 한 -v
위의 명령을,하지만 모두 필요하다면 나는 몰랐다 -v
및 VOLUME
.
답변
이 VOLUME
명령은 컨테이너 내부에 디렉토리를 마운트 하고 통합 파일 시스템을 우회하여 컨테이너 파일 구조 외부의 호스트 디스크에있는 해당 디렉토리 내에서 작성 또는 편집 된 파일을 저장합니다.
아이디어는 도커 컨테이너간에 볼륨을 공유 할 수 있으며 참조하는 컨테이너 (실행 중이거나 중지 된)가있는 한 계속 유지됩니다.
컨테이너 --volumes-from
를 실행할 때 명령 을 사용하여 다른 컨테이너가 기존 볼륨을 마운트 (컨테이너간에 효과적으로 공유)하도록 할 수 있습니다.
사이의 근본적인 차이 VOLUME
및 -v
이있다 -v
하여 고정 표시기 컨테이너 내부 운영 체제에서 기존 파일을 마운트하고 VOLUME
것 비어있는 새 볼륨 생성 하여 호스트 및 컨테이너 내부에 마운트.
예:
- 를 정의하는 Dockerfile이
VOLUME /var/lib/mysql
있습니다. - 도커 이미지를 작성하고 태그를 지정합니다.
some-volume
- 당신은 컨테이너를 실행
그리고,
- 이 볼륨을 사용하려는 다른 도커 이미지가 있습니다.
- 다음과 같이 docker 컨테이너를 실행하십시오.
docker run --volumes-from some-volume docker-image-name:tag
- 이제 도커 컨테이너가 실행되어 볼륨이
some-volume
마운트됩니다./var/lib/mysql
참고 :를 사용 --volumes-from
하면 볼륨 위치에 존재하는 모든 볼륨에 볼륨이 마운트됩니다. 즉,에 물건이 있으면 /var/lib/mysql
볼륨의 내용으로 바뀝니다.
답변
다른 사람들이 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
답변
이것은 Docker 문서 자체에서 가져온 것으로 간단하고 명확합니다.
“호스트 디렉토리는 본질적으로 호스트에 의존합니다. 이러한 이유로 Dockerfile에서 호스트 디렉토리를 마운트 할 수 없습니다. VOLUME 명령어는 빌드 된 이미지가 이식 가능해야하므로 호스트 디렉토리 전달을 지원하지 않습니다. 모든 잠재적 호스트에서 디렉토리를 사용할 수있는 것은 아닙니다. “