Docker를 배우고 있으며 언제 어디서 사용할지 ADD
및 VOLUME
. 이 두 가지가 수행하는 작업은 다음과 같습니다.
더하다
빌드 할 때 이미지에 파일을 복사합니다. 이미지에는 모든 파일이 포함되어 있으므로 매우 쉽게 배포 할 수 있습니다. 반면에 매번 빌드해야한다는 것은 개발에서 좋은 생각이 아닌 것 같습니다. 빌드하려면 개발자가 컨테이너를 다시 빌드하기 위해 명령을 실행해야하기 때문입니다. 또한 컨테이너를 만드는 데 시간이 많이 걸릴 수 있습니다.
음량
사용 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_settings
Dockerfile 에 추가하고 를 사용하여 컨테이너를 실행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
.
docker run -v /data
: 이는VOLUME
Dockerfile 에서 명령어 를 지정하는 것과 유사합니다 .docker run -v $host_path:$container_path
: 이것은 당신이 마운트 할 수 있습니다$host_path
$container_path
런타임 중에 호스트 에서 컨테이너 . 개발 중에는 호스트의 소스 코드를 컨테이너와 공유하는 데 유용합니다. 프로덕션에서는 호스트의 DNS 정보 (에서 찾을 수 있음/etc/resolv.conf
) 또는 비밀과 같은 것을 컨테이너 에 마운트하는 데 사용할 수 있습니다 . 반대로이 기술을 사용하여 컨테이너의 로그를 호스트의 특정 폴더에 쓸 수도 있습니다. 둘 다$host_path
및$container_path
절대 경로 여야합니다.docker run -v my_volume:$container_path
: 이렇게하면 컨테이너에 데이터 볼륨이 생성$container_path
되고 이름이 지정됩니다my_volume
. 을 사용하여 볼륨을 만들고 이름을 지정하는 것과 본질적으로 동일docker volume create my_volume
합니다. 이와 같은 볼륨 이름 지정은 Flocker 와 같은 다중 호스트 스토리지 드라이버를 사용하는 컨테이너 데이터 볼륨 및 공유 스토리지 볼륨에 유용 합니다.
Dockerfile에서는 호스트 폴더를 데이터 볼륨으로 마운트하는 방법을 사용할 수 없습니다. 도커 문서 를 인용하려면 ,
참고 : 이식성 및 공유 목적으로 인해 Dockerfile에서 사용할 수 없습니다. 호스트 디렉터리는 본질적으로 호스트에 따라 다르므로 Dockerfile에 지정된 호스트 디렉터리는 모든 호스트에서 작동하지 않을 수 있습니다.
이제 비 개발 환경의 컨테이너에 파일을 복사하려는 경우 Dockerfile에서 ADD
또는 COPY
지침을 사용할 수 있습니다 . 이것은 비 개발 배포에 일반적으로 사용하는 것입니다.