Kopia zapasowa woluminu dokowania i przywracanie

23

Używam Dockera do wdrażania niektórych usług na serwerze CentOS 6.4 i próbuję wymyślić, jak prawidłowo tworzyć kopie zapasowe danych, które generują.

Na przykład jedna z usług to aplikacja internetowa, w której użytkownicy mogą przesyłać pliki. Dla tego kontenera mam /fileswolumin, który chcę wykonać kopię zapasową. Montowanie na hoście wygląda na to, że jest im trochę niezadowolenie, ponieważ takie montowanie nie jest w żaden sposób przenośne - jak powiedziano w tym poście na blogu i dokumentacji dokerów dla woluminów .

Wiem z tego samego posta na blogu, że nie potrzebuję montowania hosta, aby uzyskać dostęp do plików w woluminie, mogę użyć, docker inspectaby dowiedzieć się, gdzie są pliki.

Ale oto mój problem: myślałem o utworzeniu kopii zapasowej tylko plików dokerów potrzebnych do zbudowania kontenerów i związanych z nimi woluminów. W prawdopodobnym przypadku, gdy muszę przywrócić wszystko z kopii zapasowej, jak mam się dowiedzieć, który katalog woluminów odpowiada danemu kontenerowi? Odbudowanie kontenera powoduje zmianę identyfikatora i ścieżki woluminu, więc potrzebuję dodatkowych informacji, aby je dopasować. Co jeszcze, jeśli w ogóle, powinienem wykonać kopię zapasową, aby móc faktycznie wszystko przywrócić?

fcoelho
źródło

Odpowiedzi:

24

Masz rację. Ponieważ możesz mieć wiele kontenerów z woluminami samodzielnie, musisz śledzić, która objętość odpowiada danemu kontenerowi. Jak to zrobić, zależy od konfiguracji: używam nazwy -data dla kontenera danych, więc oczywiste jest, do którego kontenera należy obraz. W ten sposób można wykonać kopię zapasową w następujący sposób:

VOLUME=`docker inspect $NAME-data | jq '.[0].Volumes["/path/in/container"]'`
tar -C $VOLUME . -czvf $NAME.tar.gz

Teraz wystarczy odbudować obraz i ponownie utworzyć kontener danych:

cat $NAME.tar.gz | docker run -name $NAME-data -v /path/in/container \
                              -i busybox tar -C /path/int/container -xzf -

Oznacza to, że musisz wykonać kopię zapasową:

  • Plik Docker
  • Tom
  • ścieżka woluminu w kontenerze
  • nazwa kontenera, do którego należy wolumin

Aktualizacja: w międzyczasie stworzyłem narzędzie do tworzenia kopii zapasowych kontenerów i ich woluminów (kontenerów): https://github.com/discordianfish/docker-backup oraz obrazu kopii zapasowej, który może tworzyć kopie zapasowe i wypychać je do s3: https://github.com/discordianfish/docker-lloyd

Johannes „fish” Ziemke
źródło
To sprawiedliwy kompromis, dzięki. Czy istnieje wyraźna zaleta korzystania z osobnego kontenera na dane?
fcoelho
To znowu naprawdę zależy od konfiguracji. Zastosowanie kontenera danych ma sens, ponieważ można łatwo do niego odwoływać, używając opcji „woluminy z” i wszystkie elementy wewnętrzne są wyodrębnione: wystarczy podłączyć woluminy z kontenera do innych kontenerów zamiast myśleć o ścieżce i punktach montowania.
Johannes 'fish' Ziemke
Mam ten błąd niepoprawna opcja - z. Wygląda na to, że domyślna tar w busybox nie obsługuje tego.
Dzung Nguyen
6
jq jest bardzo fajne, ale zamiast wprowadzenia zależności, dlaczego nie wykorzystać docker inspecty zbudowany w templating tak: VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" ). Prawdopodobnie dobrze jest też przypomnieć ludziom, aby nie spodziewali się, że utworzy kopię zapasową plików w ten sposób, gdy są aktywnie w użyciu (np. Bazy danych).
mc0e,
2
W Docker 1.8 format się zmienił - Volumeszniknęły, a Mountszamiast tego mają inną strukturę. Musimy trochę popracować, rangeaby znaleźć interesujący nas punkt montowaniaVOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
Jarek Przygódzki,
5

W nowszym Dockerze (testowanym w 1.9.1, build 9894698) możesz użyć cppolecenia .

Oto przykład, jak skopiować katalog z kontenera na host:

docker cp wordpress:/var/www/html backups/wordpress.`date +"%Y%m%d"`/

Oto przykład, jak skopiować katalog z kontenera do tarpliku:

docker cp wordpress:/var/www/html - > backups/wordpress.`date +"%Y%m%d"`.tar

Ostatni, ale nie mniej ważny przykład, jak skopiować katalog z kontenera do tar.gzpliku:

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz
czerasz
źródło
2
docker cpwysyła wszystko przez sieć. Jest to coś, czego chcesz uniknąć, zwłaszcza jeśli wolumin Docker jest już woluminem btrfs.
Jarek Przygódzki
2
Pytanie wspomina o tworzeniu kopii zapasowych i przywracaniu . Przykład przywrócenia w tej odpowiedzi docker cpbyłby miły.
MadMike,