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?
docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz
Nie zależy to od szczegółów implementacji woluminów. I zaimportuj dane za pomocą tar na drugim komputerze.Odpowiedzi:
Oficjalna odpowiedź jest dostępna w sekcji „Tworzenie kopii zapasowych, przywracanie lub migracja woluminów danych” :
UTWORZYĆ KOPIĘ ZAPASOWĄ:
--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 tarbusybox
: mały, prostszy obraz - dobry do szybkiej konserwacjitar cvf /backup/backup.tar /data
: tworzy nieskompresowany plik tar ze wszystkich plików w katalogu / dataPRZYWRACAĆ:
źródło
docker create
dla kontenerów zawierających tylko dane, aby nie zostały uruchomione. Zobacz przykład w off. dokumentacja: docs.docker.com/userguide/dockervolumes/…/data
z/var/lib/postgresql/data
, prawda?docker exec
niego wejść), to prosta komendatail -f /dev/null
nigdy nie wyjdzie, ale zużywa minimalne zasoby. Kiedy już nie potrzebujesz go do biegania,docker stop data-container
zrobi to za Ciebie. Wolumeny pozostają dla innych pojemników.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.
źródło
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.--cidfile=id.txt
jako parametru uruchomienia. Identyfikator kontenera zostanie zapisany w plikuid.txt
. Zaktualizowałem odpowiedź.docker run --rm
zamiastdocker run --cidfile ... ; docker rm
.Rozszerzając oficjalną odpowiedź z dokumentów Docker i pierwszą odpowiedź tutaj , możesz mieć następujące aliasy w swoim .bashrc lub .zshrc
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.
źródło
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: -
centralized
serwer obsługuje proces migracjiLink do projektu znajduje się tutaj:
źródło
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
rsync
ponad SSH spakowanym w dwa małe (po ~ 25 MB) obrazy. Najpierw uruchomdvsync-server
na komputerze, z którego chcesz skopiować dane (będziesz potrzebować tego,NGROK_AUTHTOKEN
który można uzyskać z pulpitu ngrok ):Następnie możesz uruchomić
dvsync-client
na maszynie, na którą chcesz skopiować pliki, przekazującDVSYNC_TOKEN
pokazany przez serwer:Po zakończeniu kopiowania klient zakończy pracę. Działa to również z Docker CLI, Compose, Swarm i Kubernetes.
źródło