Docker ADD 대 VOLUME


116

Docker를 배우고 있으며 언제 어디서 사용할지 ADDVOLUME. 이 두 가지가 수행하는 작업은 다음과 같습니다.

더하다

빌드 할 때 이미지에 파일을 복사합니다. 이미지에는 모든 파일이 포함되어 있으므로 매우 쉽게 배포 할 수 있습니다. 반면에 매번 빌드해야한다는 것은 개발에서 좋은 생각이 아닌 것 같습니다. 빌드하려면 개발자가 컨테이너를 다시 빌드하기 위해 명령을 실행해야하기 때문입니다. 또한 컨테이너를 만드는 데 시간이 많이 걸릴 수 있습니다.

음량

사용 docker run -v하면 컨테이너 내부에 호스트 폴더를 마운트 할 수 있다는 것을 이해합니다 . 이렇게하면 파일을 쉽게 수정하고 컨테이너의 앱이 변경 사항에 반응하는 것을 볼 수 있습니다. 개발에서는 멋져 보이지만이 방식으로 파일을 배포하는 방법을 잘 모르겠습니다.


3
일반적으로, 선호하는 것이 최선의 방법 COPY으로 ADD. 거의 동일하지만 ADDURL 및 아카이브 파일에 대한 몇 가지 추가 기능이 있습니다.
Adrian Mouat 2015 년

2
@jamesmstone-해당 링크 (및 공식 도커 문서)는 그 반대를 권장합니다. ADD보다는 COPY를 사용하세요.
소프트웨어 엔지니어

죄송합니다. 맞아요-건배!
jamesmstone

답변:


183

더하다

이 두 가지의 근본적인 차이점 ADD은 추가하는 모든 항목을 폴더로 만들거나 실제로 이미지의 일부로 만드는 것 입니다. 나중에 만든 이미지를 사용하는 사람은 누구나 내가 무엇이든 액세스 할 수 있습니다 ADD. Docker가 레이어에서 작동하고 레이어 ADD가 이미지의 일부로 여전히 존재 하기 때문에 나중에 제거하더라도 마찬가지 입니다. 명확하게 ADD말하면 빌드 타임 에는 무언가 만 ADD있고 런타임 에는 불가능 합니다.

사용하려는 경우의 몇 가지 예 ADD:

  • Dockerfile에서 참조하고 설치하려는 requirements.txt 파일에 몇 가지 요구 사항이 있습니다. 당신은 다음 수행 할 수 있습니다 ADD ./requirements.txt /requirements.txt다음RUN pip install -r /requirements.txt
  • 예를 들어 앱 디렉터리를 이미지의 작업 디렉터리로 설정하고 이미지에서 실행되는 컨테이너의 기본 명령이 실제로 앱을 실행하도록하려면 Dockerfile의 컨텍스트로 앱 코드를 사용하려고합니다. 할수있다:

    ADD ./ /usr/local/git/my_app

    WORKDIR /usr/local/git/my_app

    CMD python ./main.py

음량

반면에 볼륨은 이미지에서 실행되는 컨테이너가 컨테이너가 실행되는 로컬 머신의 경로에 액세스 할 수 있도록합니다. 당신은 당신의 파일을 사용할 수 없습니다 VOLUME당신의 Dockerfile의 디렉토리 . 볼륨 디렉토리의 모든 항목은 빌드시 액세스 할 수 없지만 런타임에는 액세스 할 수 있습니다 .

사용하려는 경우의 몇 가지 예 VOLUME:

  • 컨테이너에서 실행되는 앱은 /var/log/my_app. 컨테이너가 제거 될 때 삭제되지 않고 호스트 시스템에서 이러한 로그에 액세스 할 수 있기를 원합니다. Dockerfile /var/log/my_app에 추가 VOLUME /var/log/my_app한 다음 다음을 사용하여 컨테이너를 실행하여 마운트 지점을 생성하면 됩니다.docker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tag
  • 컨테이너의 앱이 액세스 할 수 있도록하려는 일부 로컬 설정 파일이 있습니다. 아마도 이러한 설정 파일은 로컬 컴퓨터와 개발 및 프로덕션에서 다를 수 있습니다. 특히 이러한 설정 파일이 비밀 인 경우에는 이미지에 해당 파일을 원하지 않습니다 . 이 경우 좋은 전략은 VOLUME /etc/settings/my_app_settingsDockerfile 에 추가하고 를 사용하여 컨테이너를 실행 docker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tag하고 앱이 실행될 것으로 예상하는 모든 환경에 / host / settings / dir이 있는지 확인하는 것입니다.

13
지금까지 가장 유용한 게시물에 지금까지 ADD와 VOLUME에서 발견
Jasmeet

5
VOLUME이 지정되었지만 docker 실행 중에 제공되지 않으면 (예 : -v xxx 매개 변수가 누락 됨) 어떻게됩니까? resp입니다. 그러면 볼륨이 효과적으로 일시적으로 변합니까?
col.panic

Dockerfile 내에서 볼륨은 아마도 지속성 및 / 또는 디버깅을위한 것일 수 있지만 볼륨 명령 줄 스위치를 사용하여 앱을 기존 이미지로 가져오고 (Dockerfile 필요 없음) 다음과 같이 실행할 수 docker run -v $HOST_PATH:$CONTAINER_PATH node:latest node $CONTAINER_PATH/app.js있습니다.
Chinoto Vokro

좋은 "레이어"세부
스트라토 바리우스의

27

VOLUME지침은 런타임에 Docker 컨테이너에 데이터 볼륨을 생성합니다. 인수로 제공 VOLUME되는 디렉토리는 Union File System 을 우회하는 디렉토리 이며 주로 영구 및 공유 데이터에 사용됩니다.

실행하면 docker inspect <your-container> 하면 Mounts섹션 아래 Source에 호스트의 디렉터리 위치 Destination를 나타내는가 있고 컨테이너에 탑재 된 디렉터리 위치를 나타내는가 표시됩니다. 예를 들면

"Mounts": [
  {
    "Name": "fac362...80535",
    "Source": "/var/lib/docker/volumes/fac362...80535/_data",
    "Destination": "/webapp",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  }
]

다음은 3 가지 사용 사례입니다 docker run -v.

  1. docker run -v /data: 이는 VOLUMEDockerfile 에서 명령어 를 지정하는 것과 유사합니다 .
  2. docker run -v $host_path:$container_path: 이것은 당신이 마운트 할 수 있습니다 $host_path$container_path 런타임 중에 호스트 에서 컨테이너 . 개발 중에는 호스트의 소스 코드를 컨테이너와 공유하는 데 유용합니다. 프로덕션에서는 호스트의 DNS 정보 (에서 찾을 수 있음 /etc/resolv.conf) 또는 비밀과 같은 것을 컨테이너 에 마운트하는 데 사용할 수 있습니다 . 반대로이 기술을 사용하여 컨테이너의 로그를 호스트의 특정 폴더에 쓸 수도 있습니다. 둘 다 $host_path$container_path 절대 경로 여야합니다.
  3. docker run -v my_volume:$container_path: 이렇게하면 컨테이너에 데이터 볼륨이 생성 $container_path되고 이름이 지정됩니다 my_volume. 을 사용하여 볼륨을 만들고 이름을 지정하는 것과 본질적으로 동일 docker volume create my_volume합니다. 이와 같은 볼륨 이름 지정은 Flocker 와 같은 다중 호스트 스토리지 드라이버를 사용하는 컨테이너 데이터 볼륨 및 공유 스토리지 볼륨에 유용 합니다.

Dockerfile에서는 호스트 폴더를 데이터 볼륨으로 마운트하는 방법을 사용할 수 없습니다. 도커 문서 를 인용하려면 ,

참고 : 이식성 및 공유 목적으로 인해 Dockerfile에서 사용할 수 없습니다. 호스트 디렉터리는 본질적으로 호스트에 따라 다르므로 Dockerfile에 지정된 호스트 디렉터리는 모든 호스트에서 작동하지 않을 수 있습니다.

이제 비 개발 환경의 컨테이너에 파일을 복사하려는 경우 Dockerfile에서 ADD또는 COPY지침을 사용할 수 있습니다 . 이것은 비 개발 배포에 일반적으로 사용하는 것입니다.


3
2 개의 도커 파일을 만들어야합니까? 하나는 개발 용이고 다른 하나는 배포 용입니까?
Cristian Garcia

나는 그렇게 생각하지 않는다. ADD명령에 의해서만 실행되기 때문에 Dockerfile에 명령 이있는 것은 잘못된 것이 아닙니다 docker build. 이는 다른 사람들이 처음으로 컨테이너를 빌드 할 때와 개발이 아닌 다른 환경에 배포 할 준비가되었을 때 필요합니다.
ivan.sim

3
그러나 파일없이 이미지를 빌드하고 -v개발을 위해 명령을 사용하고 다른 도커 파일 ADD이 배포 용 파일을 포함하는 이미지를 생성하도록 하는 것이 더 효율적이지 않을까요?
Cristian Garcia

1
결정해야하는 절충안입니다. 귀하에게 적합한 것을 선택하십시오. ADD어쨌든 빌드는 얼마나 걸립니까? 총 2 초? Dockerfile 파일이 두 개 있고 다른 사람과 공유 (또는 docker registry 에 게시 )하는 경우 어떤 파일이 기본값입니까? 올바른 기본 Dockerfile이 올바른 사용자에게 전달되도록하기 위해 약간의 추가 유지 관리 오버 헤드가 있습니다. 그러나 하루가 끝나면 가장 적합한 것이 무엇인지 결정합니다. 개인적으로 저는 컨테이너를 구축 할 Dockerfile이 하나뿐인지 확인하고 싶습니다.
ivan.sim

11
그건 그렇고 나는 먼저 추가하는 것이 괜찮다고 생각하고 개발을 위해 -v로 그 추가를 재정의하십시오. 이렇게하면 별도의 Dockerfile이 필요하지 않습니다.
Attila Szeremi 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.