호스트의 도커 장착 볼륨


135

도커 컨테이너간에 볼륨을 사용하여 폴더를 성공적으로 공유 할 수있었습니다.

docker run -v /host/path:/container/path ...

그러나 내 질문은 이것과 VOLUMEDockerfile 에서 명령을 사용하는 것의 차이점은 무엇입니까 ?

VOLUME /path

VOLUME명령 이있는 이미지를 사용하고 있으며 호스트와 공유하는 방법을 알고 싶습니다. 내가 사용하여 수행 한 -v위의 명령을,하지만 모두 필요하다면 나는 몰랐다 -vVOLUME.

답변:


155

VOLUME명령은 컨테이너 내부에 디렉토리를 마운트 하고 통합 파일 시스템을 우회하여 컨테이너 파일 구조 외부의 호스트 디스크에있는 해당 디렉토리 내에서 작성 또는 편집 된 파일을 저장합니다.

아이디어는 도커 컨테이너간에 볼륨을 공유 할 수 있으며 참조하는 컨테이너 (실행 중이거나 중지 된)가있는 한 계속 유지됩니다.

컨테이너 --volumes-from를 실행할 때 명령 을 사용하여 다른 컨테이너가 기존 볼륨을 마운트 (컨테이너간에 효과적으로 공유)하도록 할 수 있습니다.

사이의 근본적인 차이 VOLUME-v이있다 -v하여 고정 표시기 컨테이너 내부 운영 체제에서 기존 파일을 마운트하고 VOLUME비어있는 새 볼륨 생성 하여 호스트 및 컨테이너 내부에 마운트.

예:

  1. 를 정의하는 Dockerfile이 VOLUME /var/lib/mysql있습니다.
  2. 도커 이미지를 작성하고 태그를 지정합니다. some-volume
  3. 당신은 컨테이너를 실행

그리고,

  1. 이 볼륨을 사용하려는 다른 도커 이미지가 있습니다.
  2. 다음과 같이 docker 컨테이너를 실행하십시오. docker run --volumes-from some-volume docker-image-name:tag
  3. 이제 도커 컨테이너가 실행되어 볼륨이 some-volume마운트됩니다./var/lib/mysql

참고 :를 사용 --volumes-from하면 볼륨 위치에 존재하는 모든 볼륨에 볼륨이 마운트됩니다. 즉,에 물건이 있으면 /var/lib/mysql볼륨의 내용으로 바뀝니다.


12
VOLUME에 이미 지정된 디렉토리에서 -v를 사용하면 어떻게됩니까?
Jeff Storey

6
--volumes-fromVOLUME지정한 항목의 상단에 마운트합니다 -v. 흥미롭게도 컨테이너를 권한 모드 ( docker run --privileged)로 실행하는 것처럼 보이고 umounting /var/lib/mysql은 빈 디렉토리를 남겨두고 -v마운트가 a와 충돌 할 때 완전히 무시됩니다 VOLUME.
Chris McKinnel

2
컨테이너가 볼륨을 참조하는 한 볼륨이 유지된다고 말하지만 다른 곳에서 보았습니다. docs.docker.com/userguide/dockervolumes 는 "데이터 볼륨은 컨테이너의 수명주기와 상관없이 데이터를 유지하도록 설계되었으므로 컨테이너를 제거 할 때도 커가 볼륨을 자동으로 삭제하지 않으며 더 이상 사용되지 않는 볼륨을"쓰레기 수집 "하지 않습니다. 컨테이너에 의해 참조됩니다. " 이 진술 중 하나가 잘못되었습니다.
mc0e

1
컨테이너가 더 이상 참조하지 않는 경우 볼륨에있는 파일은 디스크에 보관되지만 볼륨 자체를 더 이상 사용할 수 없습니다 (볼륨을 컨테이너에 수동으로 연결하는 방법을 정확히 알지 못하는 경우에도) 이것이 가능하면 알 수 없음). 더 이상 사용할 수 없다고 말하면 --volumes-from을 사용하여 사용할 수 없습니다. 위의 "가비지 수집"이라고 말하면 볼륨에 있던 파일을 디스크에서 삭제한다는 의미입니다.
Chris McKinnel

1
-v를 사용하여 사용할 수 있지만 --volumes-from은 사용할 수 없습니다. Volumes-from은 컨테이너 이름을 사용하여 볼륨 데이터를 가져옵니다 (모든 볼륨 포인트가 필요하다고 생각합니다). 그러나 -v 자체의 경우, 매뉴얼에서는 이름이 지정된 볼륨을 -v에 형식으로 제공 할 수 있다고 언급합니다 named-volume:/path/in/container. 이름이없는 볼륨에는 이름에 대한 해시가 제공되며 고아 볼륨에 액세스하기 위해 호스트 경로 대신 해시를 제공 할 수 있습니다. :) volume ls모두 표시하지 않을 수도 docker volume ls -f dangling=true있습니다. 시도해보십시오 .
Jasmine Hegman 2016 년

44

다른 사람들이 Docker의 요점을 놓치고 있다고 생각하기 때문에 내 자신의 대답을 추가하겠습니다.

VOLUMEDocker는 특정 디렉토리에 영구 데이터가 포함되어 있음을 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

도커 호스트가 VM에서 실행중인 경우 어떻게합니까? 예를 들어, mac의 boot2docker입니다. 그런 다음이 볼륨은 원격으로 만 사용할 수 있습니다. 또한 설명대로 Dockerfile에서 볼륨을 사용하면 이미지의 내용이 볼륨에 복사됩니다. 그러나 로컬 디렉토리에 마운트 할 때이 복사는 발생하지 않습니다. 왜 그런지 아십니까? 로컬로 마운트 된 볼륨을 갖지만 여전히 이미지의 파일로 '새로 시작'하는 방법이 있습니까?
LostSalad

4
docker-compose를 사용 하면 호스트 os의 특정 위치에 볼륨을 마운트 할 수 있습니다 . 심볼릭 링크가 필요하지 않습니다 ...
Hugo Koopmans


11

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>


8

기본적 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


8

이것은 Docker 문서 자체에서 가져온 것으로 간단하고 명확합니다.

"호스트 디렉토리는 본질적으로 호스트에 의존합니다. 이러한 이유로 Dockerfile에서 호스트 디렉토리를 마운트 할 수 없습니다. VOLUME 명령어는 빌드 된 이미지가 이식 가능해야하므로 호스트 디렉토리 전달을 지원하지 않습니다. 모든 잠재적 호스트에서 디렉토리를 사용할 수있는 것은 아닙니다. "

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.