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

23

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

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

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

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

fcoelho
источник

Ответы:

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
czerasz
источник
2
docker cpотправляет все по сети. Это то, чего вы хотите избежать, особенно если ваш том Docker уже является томом btrfs.
Ярек Пшигодзки
2
Вопрос затрагивает резервное копирование и восстановление . Пример восстановления в этом ответе docker cpбудет неплохо.
MadMike