Резервне копіювання та відновлення обсягу Docker


23

Я використовую Docker для розгортання деяких служб на сервері CentOS 6.4, і я намагаюся зрозуміти, як правильно створювати резервні копії даних, які вони генерують.

Наприклад, однією з послуг є веб-додаток, куди користувачі можуть завантажувати файли. Для цього контейнера у мене є /filesоб'єм, який я хочу створити для резервного копіювання. Хост-кріплення схоже на те, що вони дещо нахмурені, тому що таке кріплення ні в якому разі не є портативним - як сказано в цьому дописі в блозі та документації на докер для томів .

З того ж допису в блозі я знаю, що мені не потрібне кріплення для доступу до файлів у томі, я можу використати, docker inspectщоб дізнатися, де такі файли.

Але ось моя проблема: я думав про створення резервного копіювання лише докерфілів, необхідних для створення контейнерів та об'ємів, пов'язаних з ними. У ймовірному випадку, що мені доведеться відновити все з резервної копії, як би я зрозумів, який каталог томів відповідає якому контейнеру? Перебудова контейнера призводить до зміни шляху ідентифікатора та гучності, тому мені знадобиться додаткова інформація для їх узгодження. Що ще, якщо що, я повинен створити резервну копію, щоб реально все відновити?

Відповіді:


24

Ти правий. Оскільки ви можете мати кілька контейнерів з томами самостійно, вам слід відслідковувати, який об'єм відповідає якому контейнеру. Як це зробити, залежить від вашого налаштування: я використовую ім'я -дані для контейнера даних, тому очевидно, до якого контейнера належить зображення. Таким чином можна створити резервну копію таким чином:

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

Тепер вам просто потрібно відновити зображення та відтворити контейнер даних:

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

Отже, це означає, що вам потрібно створити резервну копію:

  • Докерфайл
  • обсяг
  • об’ємний шлях у контейнері
  • назва контейнера, до якого належить том

Оновлення: Тим часом я створив інструмент для резервного копіювання контейнерів та їх обсягу (контейнерів): https://github.com/discordianfish/docker-backup та зображення резервного копіювання, яке може створювати резервні копії та підштовхувати їх до s3: https://github.com/discordianfish/docker-lloyd


Це справедливий компроміс, дякую. Чи є явна перевага використання окремого контейнера для даних?
fcoelho

Це знову ж таки дійсно залежить від вашої установки. Має сенс використовувати контейнер даних, тому що ви можете легко посилатися на нього, використовуючи "volumes-from", а всі внутрішні місця абстрагуються: ви просто додаєте томи з контейнера до інших контейнерів, а не думати про точки шляху та точки монтажу.
Йоганнес "риба" Зімке

У мене ця помилка недійсна - z. Здається, що тар за замовчуванням у зайнятій скриньці це не підтримує.
Джунг Нгуен

6
JQ дуже прохолодно, а не вводити залежність, то чому б не використати docker inspectвбудовану в шаблонирования так: VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" ). Напевно, також розумно нагадати людям не сподіватися на таке резервне копіювання файлів під час активного використання (наприклад, бази даних).
mc0e

2
У Docker 1.8 формат змінився - Volumesбільше немає, а є Mountsнатомість з різною структурою. Нам потрібно ще трохи попрацювати, rangeщоб знайти потрібну точку кріпленняVOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
Jarek Przygódzki

5

У новій Docker (випробувана в 1.9.1, build 9894698) ви можете використовувати cpкоманду .

Ось приклад, як скопіювати каталог з контейнера на хост:

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

Ось приклад, як скопіювати каталог з контейнера у tarфайл:

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

Останній, але не менш важливий приклад, як скопіювати каталог з контейнера у tar.gzфайл:

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

2
docker cpпосилає все по мережі. Це ви хочете уникати, особливо якщо ваш том Docker вже є томом btrfs.
Jarek Przygódzki

2
Питання згадує резервне копіювання та відновлення . Приклад відновлення у цій відповіді docker cpбуло б добре.
MadMike
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.