도커 볼륨 컨테이너와 도커 볼륨을 결정하는 방법은 무엇입니까?


24

문서를 읽은 후 생산적인 응용 프로그램 / 서비스 데이터를 가장 잘 관리하는 방법에 대해 다소 혼란 스러웠습니다.

3 가지 옵션이있는 것 같습니다.

  1. 간단히 볼륨을 호스트 디렉토리에 매핑하십시오 (예 :에 -v대한 인수 docker run).
  2. 데이터에 대한 도커 컨테이너 이미지 만들기 (예 : 별도의 컨테이너 및 --volumes-from)
  3. 고정 표시기 볼륨 만들기 (예 docker volume create)

이제는 허용되는 연습이 옵션 # 2 인 것처럼 보이지만 # 3의 목적이 무엇인지 궁금합니다.

특히 이러한 시나리오를 어떻게 올바르게 처리 docker volume하고 각 상황에 대해 데이터 볼륨 컨테이너를 사용하는 것이 더 낫습니까?

  • 서버에서 별도의 볼륨 및 / 또는 스토리지 계층의 애플리케이션 데이터가 필요합니다.
  • 백업
  • 데이터 복원


@MichaelHampton 나는 내 질문을 바꿔해야 실현
dukeofgaming

# 1은 생산을위한 심각한 옵션이 아닙니다. 대안이 존재하는 경우 기본적으로 수행해서는 안됩니다.
Michael Hampton

2
@MichaelHampton 왜? 데이터가 dockerized되지 않을 수 있지만, 호스트 OS는 여전히 인프라 팀에 의해 관리되고있는 모니터와 백업
dukeofgaming

@dukeofgaming btrfs scrub손상된 파일을 찾아서 수정하기 위해 실행할 수 있다는 것은 말할 것도 없습니다 . 도킹 된 항목이 어떻게 작동하는지 잘 모르겠지만 데이터 부패를 방지하지는 못하므로 개별 파일을 복원하는 대신 문제가 발생하면 항상 전체 복원이 필요합니다. 또 다른 추상화는 또 다른 추상화 계층을 추가하므로 파일 읽기 및 쓰기 속도가 훨씬 느려집니다. 나는 어떻게 든 # 2와 # 3의 장점을 보지 못하지만 도커에 익숙하지 않으므로 변경 될 수 있습니다.
inf3rno

답변:


18

나는 # 2와 # 3이 거의 같은 것이라고 생각합니다. 주된 차이점은 # 3으로 중지 된 컨테이너가 없다는 것입니다 (문자 그대로, 명명 된 볼륨입니다). 예를 들어, 명명 된 볼륨을 만들고 -v대신 # 2로 수행 한 작업을 유사하게 수행 할 수 있습니다 .

명명 된 볼륨을 만듭니다.

$ docker volume create --name test

컨테이너에서 해당 볼륨에 일부 데이터를 마운트하고 씁니다.

$ docker run -v test:/opt/test alpine touch /opt/test/hello

그런 다음 동일한 test볼륨을 다른 컨테이너에 마운트 하고 데이터를 읽을 수 있습니다.

$ docker run -v test:/opt/test alpine ls -al /opt/test     
total 8
drwxr-xr-x    2 root     root          4096 Jan 23 22:28 .
drwxr-xr-x    3 root     root          4096 Jan 23 22:29 ..
-rw-r--r--    1 root     root             0 Jan 23 22:28 hello

여기서 장점은 데이터 전용 컨테이너를 제거해도 볼륨이 실수로 사라지지 않는다는 것입니다. 이제 docker volume하위 명령으로 관리하십시오 .

$ d volume ls
DRIVER              VOLUME NAME
local               test

또한 볼륨 드라이버가 진행될 가능성을 열어 주므로 호스트간에 공유 볼륨을 수행 할 수 있습니다 (예 : NFS를 통해 명명 된 볼륨). 이것의 예는 Flocker and Convoy 일 수 있습니다 . 특히 데이터 이동 또는 백업에 관해 Convoy에는 데이터 백업을위한 특정 하위 명령이 있으며 호스트 외부의 NFS 또는 EBS에 저장을 허용합니다.

이러한 이유로,보다 새로운 방식 (Docker 1.9+)은 데이터 전용 컨테이너가 아닌 명명 된 볼륨을 사용하는 것입니다.


고마워, 대부분의 질문에 대답했지만 다른 물리 볼륨 계층에서 컨테이너 데이터를 관리하는 요점은 여전히 ​​답변이며 이것이 중요한 것입니다 ... 이것이 git repo 관리 솔루션이고 컨테이너의 해당 부분이 필요하다고 가정하십시오. 다른 물리적 호스트 볼륨 (예 : 다른 파티션, 물리적 디스크 등)에있는 Tier 0 스토리지의 데이터 (dockerfile에 정의 된 볼륨)
dukeofgaming

나는 종류의 볼륨 드라이버의 언급과 함께했다. 현재 실제 로컬 스토리지 드라이버 외부에 데이터를 저장하려면 원하는 것을 구체적으로 수행 한 드라이버를 사용해야합니다. 내 머리 꼭대기에는 github.com/rancher/convoygithub.com/ClusterHQ/flocker가 있습니다. Convoy는 현재와 비슷한 수준의 사운드를 제공하는 NFS 및 GlusterFS를 지원합니다. 이를 명확히하기 위해 답변을 수정하겠습니다.
Andy Shinn

devicemapper 드라이버를 사용하면 내 질문에 대답하는 것 같습니다. 감사합니다! docs.docker.com/engine/userguide/storagedriver/…
dukeofgaming

the volume won't accidentally disappear if you remove the data-only container. 좀 더 자세히 설명해 주시겠습니까? 감사.
Stephane

22

Docker 1.9부터는 Volumes API ( docker volume create --name mydata)를 사용하여 명명 된 볼륨을 생성 하는 것이 데이터 볼륨 컨테이너보다 선호됩니다. 2016 년 2 월 현재 Docker 볼륨 설명서 가 오래되었습니다. Docker 직원 "데이터 볼륨 컨테이너 가 더 이상 권장되는 패턴으로 간주되지 않습니다 ", " 명명 된 볼륨은 대부분의 경우에 데이터 전용 볼륨을 대체 할 수 있어야합니다 ."및 " 사용할 이유가 없다 "고 제안 합니다. 데이터 전용 컨테이너

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