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


121

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

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

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

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


12
데이터 컨테이너 디렉토리를 내보낼 수 있습니다. docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz이는 볼륨의 구현 세부 사항에 의존하지 않습니다. 그리고 두 번째 컴퓨터에서 tar로 데이터를 가져옵니다.
Jiri

1
와, 굉장합니다, 감사합니다 :-)))! 이 의견을 답변으로 쓰면 기꺼이 받아 들일 것입니다!
Golo Roden 2014

답변:


136

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

지원:

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

3
지금은 docker create시작되지 않도록 데이터 전용 컨테이너 에 사용하는 것이 좋습니다 . 오프의 예를 참조하십시오. 문서 : docs.docker.com/userguide/dockervolumes/…
FelikZ

1
그래서 ... Postgres 데이터베이스를 백업하려는 경우 무엇 /data/var/lib/postgresql/data, 맞습니까?
425nesp

6
"데이터 볼륨 백업, 복원 또는 마이그레이션"섹션이 Docker 문서에서 제거 된 것 같습니다 .- (
SteveC

2
@Datz는 데이터 컨테이너를 만들기 위해 호출되는 명령 일 뿐이며 실제로는 아무 작업도 수행하지 않는 명령 일 수 있습니다. 컨테이너가 시작되고 즉시 종료되지만 데이터를 유지하는 데 사용됩니다.
tommasop

1
@rszalski 어떤 이유로 컨테이너를 계속 실행해야하는 경우 (예 : 컨테이너를 실행하려는 docker exec경우) 간단한 명령은 tail -f /dev/null종료되지 않지만 최소한의 리소스를 사용하는 것입니다. 더 이상 실행할 필요가 없을 때 자동으로 수행 docker stop data-container됩니다. 볼륨은 다른 컨테이너에 남아 있습니다.
Jesse Chisholm

16

볼륨을 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

답변 해 주셔서 감사합니다. 데이터 컨테이너를 한 호스트에서 다른 호스트로 어떻게 이동할 수 있습니까?
Dzung Nguyen 2014

1
@nXqd 데이터 컨테이너는에 의해 생성됩니다 docker run -v /data-volume -name datacointainer busybox true-어디서나 실행할 수 있습니다. 데이터 컨테이너를 만든 후 답변에 설명 된대로 tar 아카이브를 가져올 수 있습니다.
Jiri

답변 해 주셔서 감사합니다. 하지만 나중에 백업에 사용되는 좀비 컨테이너를 제거해야하는 또 다른 문제가 있습니다. 이것은 id를 반환하지 않기 때문에. 좋은 방법이 있나요 : D
Dzung Nguyen

@nXqd 물론입니다- --cidfile=id.txt실행 매개 변수 로 사용해야 합니다. 컨테이너 ID는 파일에 저장됩니다 id.txt. 답변을 업데이트했습니다.
Jiri

9
docker run --rm대신 사용할 수 있습니다 docker run --cidfile ... ; docker rm.
Felix Rabe

16

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를 사용합니다. 백업 할 파일이 큰 경우 압축을 사용하는 것이 좋습니다.


3

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

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

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

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

https://github.com/nadgowdas/cargo

3

머신이 다른 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에서도 작동합니다.

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