Jak przenosić woluminy zawierające tylko dane z jednego hosta na inny?

121

Jak opisano w dokumentacji platformy Docker dotyczącej pracy z wolumenami, istnieje koncepcja tak zwanych kontenerów zawierających tylko dane , które zapewniają wolumin, który można zamontować w wielu innych kontenerach, niezależnie od tego, czy kontener zawierający tylko dane jest faktycznie uruchomiony, czy nie.

Zasadniczo brzmi to niesamowicie. Ale jest jedna rzecz, której nie rozumiem.

Te woluminy (które nie są jawnie mapowane do folderu na hoście ze względu na przenośność, jak stwierdza dokumentacja) są tworzone i zarządzane przez Docker w pewnym folderze wewnętrznym na hoście ( /var/docker/volumes/…).

Przypuśćmy, że używam takiego wolumenu, a następnie muszę go przenieść z jednego hosta na inny - jak przenieść wolumin? AFAICS ma unikalny identyfikator - czy mogę po prostu skopiować wolumin i jego odpowiedni kontener zawierający tylko dane do nowego hosta? Jak sprawdzić, które pliki skopiować? Czy jest jakieś wsparcie wbudowane w Docker, którego jeszcze nie odkryłem?

Golo Roden
źródło
12
Możesz wyeksportować katalog kontenerów danych: docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgzNie zależy to od szczegółów implementacji woluminów. I zaimportuj dane za pomocą tar na drugim komputerze.
Jiri,
1
Wow, to super, dzięki :-)))! Jeśli napiszesz ten komentarz jako odpowiedź, z przyjemnością go przyjmę!
Golo Roden

Odpowiedzi:

136

Oficjalna odpowiedź jest dostępna w sekcji „Tworzenie kopii zapasowych, przywracanie lub migracja woluminów danych” :

UTWORZYĆ KOPIĘ ZAPASOWĄ:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: wyjmij pojemnik, gdy wyjdzie
  • --volumes-from DATA: dołącz do woluminów współdzielonych przez kontener DATA
  • -v $(pwd):/backup: bind podłącz bieżący katalog do kontenera; zapisać plik tar
  • busybox: mały, prostszy obraz - dobry do szybkiej konserwacji
  • tar cvf /backup/backup.tar /data: tworzy nieskompresowany plik tar ze wszystkich plików w katalogu / data

PRZYWRACAĆ:

# 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
tommasop
źródło
3
Na razie lepiej jest używać docker createdla kontenerów zawierających tylko dane, aby nie zostały uruchomione. Zobacz przykład w off. dokumentacja: docs.docker.com/userguide/dockervolumes/…
FelikZ
1
Jeśli tak ... Próbuję kopii zapasowej bazy danych PostgreSQL, co chciałbym wymienić /dataz /var/lib/postgresql/data, prawda?
425nesp
6
Wydaje się, że sekcja „Tworzenie kopii zapasowych, przywracanie lub migracja woluminów danych” została usunięta z dokumentacji platformy Docker :-(
SteveC,
2
@Datz to tylko polecenie wywołane w celu utworzenia kontenera danych. Może to być dowolne polecenie, które w rzeczywistości nic nie robi. Kontener jest uruchamiany i natychmiast zamykany, ale służy do utrwalania danych.
tommasop
1
@rszalski Jeśli z jakiegoś powodu potrzebujesz, aby kontener pozostał uruchomiony (powiedzmy, że chcesz do docker execniego wejść), to prosta komenda tail -f /dev/nullnigdy nie wyjdzie, ale zużywa minimalne zasoby. Kiedy już nie potrzebujesz go do biegania, docker stop data-containerzrobi to za Ciebie. Wolumeny pozostają dla innych pojemników.
Jesse Chisholm
16

Możesz wyeksportować wolumen do tar i przenieść na inny komputer. I zaimportuj dane za pomocą tar na drugim komputerze. Nie zależy to od szczegółów implementacji woluminów.

# 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
Jiri
źródło
Dziękuję za odpowiedź. Jak mogę przenieść kontener danych z jednego hosta na inny?
Dzung Nguyen
1
@nXqd Kontener danych jest tworzony przez docker run -v /data-volume -name datacointainer busybox true- możesz go uruchomić w dowolnym miejscu. Po utworzeniu kontenera danych możesz zaimportować archiwum tar, jak wyjaśniono w odpowiedzi.
Jiri,
Dziękuję za odpowiedź. Ale napotkałem inny problem, że musimy usunąć kontener zombie, który jest później używany do tworzenia kopii zapasowych. Ponieważ to nie zwraca id. Masz jakiś dobry sposób: D
Dzung Nguyen
@nXqd Jasne - musisz użyć --cidfile=id.txtjako parametru uruchomienia. Identyfikator kontenera zostanie zapisany w pliku id.txt. Zaktualizowałem odpowiedź.
Jiri
9
Możesz po prostu użyć docker run --rmzamiast docker run --cidfile ... ; docker rm.
Felix Rabe
16

Rozszerzając oficjalną odpowiedź z dokumentów Docker i pierwszą odpowiedź tutaj , możesz mieć następujące aliasy w swoim .bashrc lub .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}"
}

Pamiętaj, że kopia zapasowa jest zapisywana w /tmp, więc możesz przenosić plik kopii zapasowej zapisany tam między hostami dockera.

Istnieją również dwie pary aliasów kopii zapasowych / przywracania. Jedna z kompresją i debianem: jessie, a druga bez kompresji, ale z busyboxem. Preferuj kompresję, jeśli pliki do kopii zapasowej są duże.

Luís Bianchin
źródło
3

Dodam tutaj inne najnowsze narzędzie od IBM, które jest faktycznie stworzone do migracji wolumenu z jednego hosta kontenera na inny. To jest obecnie realizowany projekt. Dlatego w przyszłości możesz znaleźć inną wersję z dodatkowymi funkcjami.

Cargo zostało opracowane w celu migracji kontenerów z jednego hosta na inny wraz z ich danymi przy minimalnych przestojach. Cargo wykorzystuje możliwości federacji danych systemu plików unii w celu utworzenia ujednoliconego widoku danych (głównie głównego systemu plików) na hostach źródłowym i docelowym. Pozwala to Cargo na niemal natychmiastowe uruchomienie kontenera (w ciągu milisekund) na hoście docelowym, gdy dane ze źródłowego systemu plików są kopiowane na hosty docelowe na żądanie (przy użyciu partycji kopiowania przy zapisie (COW) ) lub leniwie w tle (przy użyciu rsync) .

Ważne punkty to: - centralizedserwer obsługuje proces migracji

Link do projektu znajduje się tutaj:

https://github.com/nadgowdas/cargo
Arif A.
źródło
3

Jeśli twoje maszyny znajdują się w różnych VPC lub chcesz kopiować z / na maszynę lokalną (jak w moim przypadku), możesz użyć dvsync, który stworzyłem. Jest to w zasadzie ngrok w połączeniu z rsyncponad SSH spakowanym w dwa małe (po ~ 25 MB) obrazy. Najpierw uruchom dvsync-serverna komputerze, z którego chcesz skopiować dane (będziesz potrzebować tego, NGROK_AUTHTOKENktóry można uzyskać z pulpitu ngrok ):

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

Następnie możesz uruchomić dvsync-clientna maszynie, na którą chcesz skopiować pliki, przekazując DVSYNC_TOKENpokazany przez serwer:

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

Po zakończeniu kopiowania klient zakończy pracę. Działa to również z Docker CLI, Compose, Swarm i Kubernetes.

suda
źródło