[docker] Docker ADD 대 VOLUME

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

더하다

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

음량

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



답변

더하다

이 두 가지의 근본적인 차이점 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이 있는지 확인하는 것입니다.

답변

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지침을 사용할 수 있습니다 . 이것은 비 개발 배포에 일반적으로 사용하는 것입니다.


답변