Programing

Docker ADD 대 VOLUME

crosscheck 2020. 8. 12. 07:40
반응형

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: This allows you to mount $host_path from your host to $container_path in your container during runtime. In development, this is useful for sharing source code on your host with the container. In production, this can be used to mount things like the host's DNS information (found in /etc/resolv.conf) or secrets into the container. Conversely, you can also use this technique to write the container's logs into specific folders on the host. Both $host_path and $container_path must be absolute paths.
  3. docker run -v my_volume:$container_path: This creates a data volume in your container at $container_path and names it my_volume. It is essentially the same as creating and naming a volume using docker volume create my_volume. Naming a volume like this is useful for a container data volume and a shared-storage volume using a multi-host storage driver like Flocker.

Notice that the approach of mounting a host folder as a data volume is not available in Dockerfile. To quote the docker documentation,

Note: This is not available from a Dockerfile due to the portability and sharing purpose of it. As the host directory is, by its nature, host-dependent, a host directory specified in a Dockerfile probably wouldn't work on all hosts.

Now if you want to copy your files to containers in non-development environments, you can use the ADD or COPY instructions in your Dockerfile. These are what I usually use for non-development deployment.

참고URL : https://stackoverflow.com/questions/27735706/docker-add-vs-volume

반응형