Назад | Перейти на главную страницу

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

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

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

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

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

Ты прав. Поскольку у вас может быть несколько контейнеров с отдельными томами, вам нужно отслеживать, какой том какому контейнеру соответствует. Как это сделать, зависит от ваших настроек: я использую имя -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

В более новой версии 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