[docker] 데이터 전용 볼륨을 한 호스트에서 다른 호스트로 포팅하는 방법은 무엇입니까?

볼륨 작업 에 대한 Docker 문서에 설명 된대로 데이터 전용 컨테이너가 실제로 실행 중인지 여부에 관계없이 다른 여러 컨테이너에 마운트 할 수있는 볼륨을 제공하는 소위 데이터 전용 컨테이너 의 개념 이 있습니다.

기본적으로 이것은 굉장한 소리입니다. 그러나 내가 이해하지 못하는 것이 하나 있습니다.

이러한 볼륨 ( 문서에 나와있는 것처럼 이식성을 위해 호스트의 폴더에 명시 적으로 매핑 되지 않음 )은 Docker가 호스트의 일부 내부 폴더 ( /var/docker/volumes/…) 에서 만들고 관리합니다 .

이러한 볼륨을 사용하고 한 호스트에서 다른 호스트로 마이그레이션해야한다고 가정합니다. 볼륨을 어떻게 이식합니까? AFAICS에는 고유 ID가 있습니다. 볼륨과 해당 데이터 전용 컨테이너를 새 호스트에 복사하면됩니까? 복사 할 파일을 어떻게 찾습니까? 아니면 아직 발견하지 못한 Docker에 내장 된 지원이 있습니까?



답변

공식 답변은 “데이터 볼륨 백업, 복원 또는 마이그레이션” 섹션에서 확인할 수 있습니다 .

지원:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: 종료시 컨테이너를 제거합니다.
  • --volumes-from DATA: DATA 컨테이너가 공유하는 볼륨에 연결
  • -v $(pwd):/backup: bind는 현재 디렉토리를 컨테이너에 마운트합니다. tar 파일을 쓰려면
  • busybox: 작고 단순한 이미지-빠른 유지 보수에 좋습니다.
  • tar cvf /backup/backup.tar /data: / data 디렉토리에있는 모든 파일의 압축되지 않은 tar 파일을 만듭니다.

복원:

# create a new data container
$ sudo docker create -v /data --name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt


답변

볼륨을 tar로 내보내고 다른 시스템으로 전송할 수 있습니다. 그리고 두 번째 컴퓨터에서 tar로 데이터를 가져옵니다. 이것은 볼륨의 구현 세부 사항에 의존하지 않습니다.

# you can list shared directories of the data container
docker inspect <data container> | grep "/vfs/dir/"

# you can export data container directory to tgz
docker run --cidfile=id.tmp --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz

# clean up: remove exited container used for export and temporary file
docker rm `cat id.tmp` && rm -f id.tmp


답변

Docker 문서 의 공식 답변 과 여기 최고의 답변을 확장하면 .bashrc 또는 .zshrc에 다음 별칭을 사용할 수 있습니다.

# backup files from a docker volume into /tmp/backup.tar.gz
function docker-volume-backup-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -czvf /backup/backup.tar.gz "${@:2}"
}
# restore files from /tmp/backup.tar.gz into a docker volume
function docker-volume-restore-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -xzvf /backup/backup.tar.gz "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie ls -lh "${@:2}"
}
# backup files from a docker volume into /tmp/backup.tar
function docker-volume-backup() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -cvf /backup/backup.tar "${@:2}"
}
# restore files from /tmp/backup.tar into a docker volume
function docker-volume-restore() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -xvf /backup/backup.tar "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox ls -lh "${@:2}"
}

백업은에 저장 /tmp되므로 여기에 저장된 백업 파일을 도커 호스트간에 이동할 수 있습니다.

또한 두 쌍의 백업 / 복원 별칭이 있습니다. 하나는 압축과 debian : jessie를 사용하고 다른 하나는 압축이 없지만 busybox를 사용합니다. 백업 할 파일이 큰 경우 압축을 사용하는 것이 좋습니다.


답변

한 컨테이너 호스트에서 다른 컨테이너 호스트로 실제로 볼륨 마이그레이션을 위해 만들어진 IBM의 또 다른 최신 도구를 여기에 추가하겠습니다. 이것은 현재 진행중인 프로젝트입니다. 따라서 향후 추가 기능이있는 다른 버전을 찾을 수 있습니다.

Cargo 는 최소한의 다운 타임으로 데이터와 함께 컨테이너를 한 호스트에서 다른 호스트로 마이그레이션하기 위해 개발되었습니다. Cargo는 통합 파일 시스템 의 데이터 연합 기능을 사용 하여 소스 및 대상 호스트에 걸쳐 데이터 (주로 루트 파일 시스템)의 통합보기를 생성합니다. 이를 통해 소스 루트 파일 시스템의 데이터가 요청시 (COW (기록 중 복사) 파티션 사용) 또는 느리게 대상 호스트에 복사되므로 Cargo는 대상 호스트에서 거의 즉시 (밀리 초 이내) 컨테이너를 시작할 수 있습니다. 백그라운드에서 (rsync 사용) .

중요한 점은 다음과 같습니다.- centralized서버가 마이그레이션 프로세스를 처리합니다.

프로젝트에 대한 링크는 다음과 같습니다.

https://github.com/nadgowdas/cargo


답변

머신이 다른 VPC에 있거나 로컬 머신 (제 경우와 같이)에서 복사하려는 경우 내가 만든 dvsync 를 사용할 수 있습니다 . 기본적 으로 두 개의 작은 (모두 ~ 25MB) 이미지로 패키지 된 SSH 를 통해 결합 된 ngrokrsync 입니다. 먼저 dvsync-server데이터를 복사하려는 머신에서 시작합니다 ( ngrok 대시 보드NGROK_AUTHTOKEN 에서 얻을 수있는 이 필요합니다 ).

$ docker run --rm -e NGROK_AUTHTOKEN="$NGROK_AUTHTOKEN" \
  --mount source=MY_VOLUME,target=/data,readonly \
  quay.io/suda/dvsync-server

그런 다음 dvsync-client파일을 복사하려는 시스템에서를 시작 DVSYNC_TOKEN하여 서버에 표시된 내용을 전달할 수 있습니다 .

docker run -e DVSYNC_TOKEN="$DVSYNC_TOKEN" \
  --mount source=MY_TARGET_VOLUME,target=/data \
  quay.io/suda/dvsync-client

복사가 완료되면 클라이언트가 종료됩니다. 이것은 Docker CLI, Compose, Swarm 및 Kubernetes에서도 작동합니다.


답변