Резервное копирование и восстановление тома Docker


23

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

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

Из того же поста в блоге я знаю, что мне не нужно подключать хост для доступа к файлам в томе, я могу использовать, docker inspectчтобы узнать, где находятся файлы.

Но вот моя проблема: я думал о резервном копировании только докер-файлов, необходимых для создания контейнеров, и томов, связанных с ними. В том случае, если мне придется восстановить все из резервной копии, как мне узнать, какой каталог томов соответствует какому контейнеру? Перестройка контейнера приводит к изменению идентификатора и пути тома, поэтому мне потребуется дополнительная информация для их сопоставления. Что еще, если что, я должен сделать резервную копию, чтобы иметь возможность восстановить все?

Ответы:


24

Вы правы. Поскольку вы можете иметь несколько контейнеров с томами самостоятельно, вам необходимо отслеживать, какой том соответствует тому или иному контейнеру. Как это сделать, зависит от вашей настройки: я использую имя -data для контейнера данных, поэтому очевидно, к какому контейнеру относится изображение. Таким образом, это может быть зарезервировано следующим образом:

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 -

Так что это означает, что вам нужно сделать резервную копию:

  • Dockerfile
  • объем
  • объемный путь в контейнере
  • название контейнера, к которому принадлежит том

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


Это честный компромисс, спасибо. Есть ли явное преимущество использования отдельного контейнера для данных?
— fcoelho

Это снова действительно зависит от вашей настройки. Имеет смысл использовать контейнер данных, потому что вы можете легко ссылаться на него с помощью «volume-from» и отделять все внутренние компоненты: вы просто присоединяете тома из контейнера к другим контейнерам вместо того, чтобы думать с точки зрения пути и точек монтирования.
— Йоханнес 'рыба' Зимке

У меня эта ошибка недопустимая опция - z. Кажется, что tar по умолчанию в busybox не поддерживает это.
— Дзунг Нгуен

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.
— Ярек Пшигодзки

2
Вопрос затрагивает резервное копирование и восстановление . Пример восстановления в этом ответе docker cpбудет неплохо.
— MadMike
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.