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

Данные Docker распределены по различным объектам и файлам Docker. К сожалению, не существует универсального подхода для создания резервных копий отдельных данных Docker. Однако несколько различных команд можно использовать в комбинации. Мы покажем вам, как создавать и восстанавливать резервные копии Docker.

Мы уже рассмотрели: «Что такое резервное копирование?», различные стратегии резервного копирования и объяснили, как создавать резервные копии баз данных. Далее мы рассмотрим создание резервных копий Docker.

Что следует учитывать при создании резервных копий Docker?

Не существует специального инструмента для резервного копирования Docker, такого как резервное копирование MySQL с помощью mysqldump или PostgreSQL с помощью pg_dump. Хотя поиск по команде «docker backup volume» или «docker backup container» будет безуспешным, существуют альтернативные подходы, которые включают отдельные компоненты Docker в резервные копии. Прежде всего, следует рассмотреть, какие компоненты Docker следует резервировать.

Какие компоненты Docker следует резервировать?

Как правило, резервные копии должны создаваться для всех данных, которые невозможно восстановить в случае их потери. В случае с Docker существует как минимум три типа данных:

  1. Объекты Docker: Ими управляет демон Docker Daemon, а данные хранятся в специальном каталоге. Между расположенными там файлами и данными в контейнере Docker нет соответствия один к одному. Мы создадим резервные копии следующих объектов Docker:
    • контейнер Docker
    • тома Docker
    • образ Docker
  2. Файлы сборки Docker: Они управляются пользователем и могут находиться в произвольных папках на хост-системе. Файлы сборки можно легко копировать и архивировать. Мы создадим резервные копии следующих файлов сборки Docker:
    • папка проекта Docker Compose
    • Dockerfiles
  3. Базы данных внутри контейнера: Они экспортируются из контейнера в виде файлов дампа. Мы создадим резервные копии баз данных для следующих систем:
    • базы данных MySQL
    • база данных PostgreSQL

Создание резервных копий Docker включает запись данных в архивные файлы на хост-системе. Затем архивные файлы копируются с локальной системы на систему резервного копирования.

Возможно, стоит автоматизировать этот процесс, если создается много резервных копий Docker. Сложные скрипты, упрощающие создание резервных копий Docker, доступны на GitHub. Разработчик Андреас Лауб предоставляет ряд практических инструментов резервного копирования Docker под лицензией с открытым исходным кодом.

Цитата

«С помощью этого скрипта вы можете создать резервную копию вашей среды docker. Есть один для проекта compose, для mysql или mariadb, для postgres SQL и для обычных томов docker.» Источник: https://github.com/alaub81/backup_docker_scripts

Примечание

Рекомендуется периодически создавать резервные копии данных Portainer, если вы используете программное обеспечение Portainer для администрирования среды Docker.

Где хранятся данные контейнеров Docker?

Для создания резервной копии необходимо скопировать данные. Во-первых, нам нужно знать, где находятся данные. Во вселенной Docker тома docker служат местом хранения данных для обмена между контейнерами Docker и хост-системой или, как вариант, между несколькими контейнерами.

Контейнер Docker создается из образа Docker, доступного только для чтения. Внесение изменений в работающий контейнер может быть рискованным и привести к потерям при удалении контейнера. Данные могут быть постоянно резервированы путем экспорта из работающего контейнера.

Данные контейнера также могут храниться в работающем контейнере вместе с томами Docker. Эти данные оказываются на доступном для записи уровне хранения файловой системы контейнера. В большинстве случаев это не идеальный вариант. Поэтому хорошей идеей является разумная настройка системы и использование тома Docker.

Определить, где именно хранятся данные контейнера, довольно сложно, поскольку существует более одного типа тома Docker. Существуют тонкие различия в расположении и судьбе данных при удалении контейнера в зависимости от типа используемого тома. Ниже приведен обзор основных компонентов хранилища Docker:

Компонент хранилища Docker Расположение При удалении контейнера
Записываемый слой контейнера Объединенная файловая система Данные теряются
Связывающее монтирование Папка в файловой системе хоста Данные остаются
Именованный том Внутри среды Docker Данные остаются
Анонимный том Внутри среды Docker Данные удаляются

Пошаговое руководство по созданию резервных копий Docker

Для резервного копирования Docker обычно создается архив tarball с помощью команды tar. Общая команда для создания архивного файла tar приведена ниже:

tar -cvf <path/to/archive-file>.tar <path/to/file-or-folder>

Однако при включении этой команды в архив включается весь путь к заархивированной папке. Это может быть проблематично при восстановлении. Поэтому существует альтернативный подход:

cd <path/to/file-or-folder> && tar -cvf <path/to/archive-file>.tar .

Сначала нужно перейти в папку, которая будет архивироваться, и применить команду tar к текущей папке. В командной строке текущая папка обозначается точкой (.). Комбинация этих двух шагов с оператором && гарантирует, что архивирование будет выполнено только в том случае, если изменение папки назначения было успешным.

Файлы .tar, созданные при архивировании данных Docker, можно найти на хост-системе. Архивные файлы необходимо перенести в систему резервного копирования для создания резервной копии. Это можно сделать с помощью внешнего хранилища или облачного хранилища. Для переноса можно использовать специальные инструменты, такие как Rsync или S3.

Совет

Мы объясняем, как создать резервную копию сервера с помощью Rsync в нашей подробной статье.

В следующих таблицах приведен обзор шагов, необходимых для создания резервных копий Docker, и соответствующих команд. В некоторых случаях для создания резервной копии объекта Docker можно использовать более одного подхода.

Объект Docker Создание резервной копии Пример команды
Контейнер Docker Сохранить как образ Docker docker container commit <container-id> <backup-name>
Docker-образ Экспортировать в архив tarball / Поместить в реестр docker image save —output <image-backup>.tar <image-id> / docker image push <image-id>
Docker volume Смонтируйте том в контейнере; затем создайте архивы tarball из контейнера docker run —rm —volumes-from <container-id> —volume <host:container> <image> bash -c «tar -cvf <volume-backup>.tar <path/to/volume/data>»
Папка проекта Docker Compose Создайте архив tarball/Версионирование с помощью Git tar -cvf <compose-backup>.tar </path/to/compose-dir>
Dockerfile Сохранить файл/Версия с помощью Git tar -cvf <dockerfile-backup>.tar <path/to/dockerfile>

Предполагая, что файлы резервных копий находятся в папке /backup/ в домашнем каталоге после их создания, создайте эту папку в качестве подготовительного шага:

mkdir -p ~/backup/

Создание резервной копии Docker-контейнера

Данные, находящиеся в контейнере Docker, хранятся в слоях, доступных только для чтения, в объединенной файловой системе. Контейнер Docker основан на образе, доступном только для чтения, и содержит дополнительный, доступный для записи слой в дополнение к слоям образа.

Для постоянного резервного копирования данных в слое, доступном для записи, необходимо создать новый образ из работающего контейнера. Для этого необходимо использовать команду «docker commit». Содержимое образа в виде архива tarball должно быть сохранено в резервную копию:

  1. Записать файловую систему Docker в образ
docker container commit <container-id> <backup-name>
  1. Экспортировать полученный образ в виде архивного файла tarball
docker image save --output ~/backup/<backup-name>.tar <backup-name>

В качестве альтернативы, отправьте полученный образ в хранилище с помощью команды «docker image push»:

docker image push <backup-name>
Примечание

Команда «docker container export» также может быть использована для экспорта файловой системы контейнера. Однако при этом все слои сводятся к одному слою. Поэтому такой подход не подходит для создания резервной копии.

Создание резервной копии образа Docker

Мы используем знакомый подход для создания резервной копии образа Docker, доступного на локальном хосте. Данные образа должны быть записаны в архив tarball:

docker image save --output ~/backup/<image-name>.tar <image-name>

Создание резервной копии тома Docker

Создание резервной копии тома Docker — сложный процесс. Мы должны различать «bind mounts», «named» и «anonymous» тома Docker. Доступ к bind mount из файловой системы хоста прост, поэтому создать tarball-архив этой папки не составит труда:

cd <path/to/docker-mount/> && tar -cvf ~/backup/<volume-backup>.tar .

Создание резервной копии именованного или анонимного тома из Docker — это совсем другая ситуация, поскольку доступ к томам возможен только внутри запущенного контейнера Docker. Хитрость архивирования данных, содержащихся в томе Docker, заключается в запуске контейнера с доступом к тому. Затем данные тома архивируются из запущенного контейнера. Давайте рассмотрим отдельные этапы этого процесса:

  1. Остановить контейнер с доступом к тому
docker stop <container-id>
  1. Запуск временного контейнера и извлечение данных тома

Временный контейнер имеет доступ к нужным томам, а также к папке резервного копирования на хосте.

docker run --rm --volumes-from <container-id> --volume ~/backup:/backup ubuntu bash -c "cd <path/to/volume/data> && tar -cvf /backup/<volume-backup>.tar ."
  1. Перезапуск контейнера с доступом к тому
docker start <container-id>

Команда извлечения данных тома является сложной. Давайте рассмотрим отдельные компоненты подробнее:

Компонент команды Объяснение
—rm Дает команду Docker удалить новый контейнер после создания резервной копии тома.
—volumes-from <container-id> Монтирует тома указанного контейнера в новый контейнер и делает данные внутри доступными.
—volume ~/backup:/backup Создает связующее монтирование между папкой ~/backup/ на хост-системе и папкой /backup/ внутри контейнера.
ubuntu Указывает, что новый контейнер должен загружать образ Ubuntu Linux.
bash -c «cd …» Создает tarball-архив данных тома в папке /backup/ в новом запущенном контейнере; связывание этой папки с папкой ~/backup/ на хост-системе делает архивный файл доступным вне Docker.

Резервное копирование папки проекта Docker Compose

Для резервного копирования папки проекта Docker Compose необходимо создать tarball-архив папки:

cd <path/to/docker-compose-dir> && tar -cvf ~/backup/<compose-backup>.tar .
Примечание

Хорошей идеей является версионирование файла docker-compose.yaml с помощью Git. Важно хранить конфиденциальные данные, такие как пароли, в отдельном файле .env и исключить их из проверки версий с помощью .gitignore.

Создание резервной копии Dockerfile

Перейдите в папку, содержащую Dockerfile, и создайте tarball-архив Dockerfile для полного резервного копирования Dockerfile:

cd <path/to/dockerfile-dir> && tar -cvf ~/backup/<dockerfile-backup>.tar ./Dockerfile
Примечание

Хорошей идеей является версионирование файла с именем «Dockerfile» с помощью Git. Важно хранить конфиденциальные данные, такие как пароли, в отдельном файле .env и исключить его из проверки версий с помощью .gitignore.

Создание резервной копии базы данных в контейнере Docker

В настоящее время базы данных обычно являются контейнерными. Для создания резервной копии базы данных, запущенной в контейнере Docker, обычно используются инструменты резервного копирования, специфичные для базы данных, такие как mysqldump и pg_dump.

Соответствующий инструмент резервного копирования работает внутри контейнера Docker. Для этого необходимо использовать команду «docker exec», что показано ниже на примере базы данных MySQL. Команда «mysqldump» работает внутри контейнера. Полученный дамп отправляется на стандартный вывод оболочки хоста. Файл дампа SQL должен быть записан в папку backup локального хоста с использованием перенаправления:

docker exec <container-id> /usr/bin/mysqldump --user=root --password=<password> <dbname> > ~/backup/<dbname>.sql

Создание резервной копии базы данных PostgreSQL из работающего контейнера Docker аналогично. Предположим, что имя пользователя и пароль базы данных хранятся в файле .pgpass внутри контейнера. Ниже приведен обзор создания резервной копии в формате пользовательского дампа:

docker exec <container-id> pg_dump --format=custom --dbname=<dbname> > ~/backup/<dbname>.dump

Можно также создать классический простой текстовый SQL-дамп. Просто добавьте опции «-clean» и «—if-exists». Цель состоит в том, чтобы очистить целевую базу данных перед импортом, чтобы дамп можно было импортировать в исходную систему без сообщений об ошибках:

docker exec <container-id> pg_dump --format=plain --clean --if-exists --dbname=<dbname> > ~/backup/<dbname>.dump

Пошаговое руководство по восстановлению резервных копий Docker

Создание резервных копий данных Docker было рассмотрено. Теперь в оставшейся части статьи мы перейдем к восстановлению данных из резервных копий Docker. Мы предполагаем, что все резервные копии доступны на локальном хосте в папке ~/backup/. Возможно, сначала потребуется скопировать резервные копии с носителя резервных копий в папку backup.

Восстановление контейнеров Docker из резервной копии

Небольшое напоминание: для создания резервной копии контейнера Docker мы создаем новый образ из работающего контейнера, а затем сохраняем его в виде архивного файла tarball. Используйте команду «docker image load» для восстановления образа Docker из архива tarball:

docker image load --input ~/backup/<image-name>.tar

Запустите новый контейнер из полученного образа. Мы используем опцию «-detach» для запуска контейнера в фоновом режиме:

docker run --detach <image-id>
Совет

Используйте команду «docker image ls» для отображения списка доступных образов Docker вместе с их именами и идентификаторами.

Восстановление образа Docker из резервной копии

Мы уже описывали восстановление образа Docker из архива tarball. Следует использовать команду «docker image load»:

docker image load --input ~/backup/<image-name>.tar

Восстановление резервной копии тома на хосте Docker

Восстановление данных тома Docker из резервной копии — сложный процесс. Точная процедура зависит от конкретного сценария развертывания. Мы продемонстрируем, как перезаписать данные тома из резервной копии. Мы предполагаем, что система такая же, как и та, на которой была создана резервная копия, то есть контейнеры, тома и другие объекты Docker присутствуют. Процесс усложняется, если система только что настроена.

Для восстановления резервной копии тома Docker требуется временный контейнер с доступом к тому. Мы уже описали, как именно работает команда Docker. Проиллюстрируем отдельные шаги процесса подробнее:

  1. Остановить контейнеры, использующие том
docker stop <container-id>
  1. Запустить временный контейнер с доступом к тому и скопировать данные Docker из резервной копии на том.
docker run --rm --volumes-from <container-id> --volume ~/backup:/backup ubuntu bash -c "cd <path/to/volume/data> && tar -xvf /backup/<volume-backup>.tar"
  1. Перезапустить контейнеры, использующие том.
docker start <container-id>

Восстановление папки проекта Docker Compose из резервной копии

Восстановление папки проекта Docker Compose из резервной копии не представляет собой ничего сложного. Перейдите в папку Docker Compose и распакуйте архив tarball. При этом существующие данные будут перезаписаны.

cd <path/to/docker-compose-dir> && tar -xvf ~/backup/<compose-backup>.tar

Восстановление Dockerfile из резервной копии

Восстановить Dockerfile из tarball-архива очень просто. Просто распакуйте архив tarball в папку Dockerfile. Существующий Dockerfile будет перезаписан.

cd <path/to/dockerfile-dir> && tar -xvf ~/backup/<dockerfile-backup>.tar

Восстановление базы данных в Docker-контейнере из резервной копии

Используйте команду «docker exec» для восстановления базы данных, расположенной в контейнере Docker, из резервной копии. Опция «-interactive» запускает контейнер в интерактивном режиме и держит открытым стандартный ввод.

Выведите содержимое дампа MySQL с помощью команды cat и направьте вывод в команду Docker на локальном хосте. Команда mysql выполняется внутри контейнера и обрабатывает SQL-запросы, которые восстанавливают базу данных.

cat ~/backup/<dbname>.sql | docker exec --interactive <container-id> /usr/bin/mysql --user=root --password=<password> <dbname>

Процесс восстановления базы данных PostgreSQL несколько сложнее. В зависимости от формата дампа базы данных можно использовать один из двух доступных инструментов. Запустите инструмент pg_restore внутри контейнера, чтобы восстановить дамп базы данных в «пользовательском» формате PostgreSQL. Используйте перенаправление ввода, чтобы передать файл дампа в качестве входных данных:

docker exec --interactive <container-id> pg_restore --dbname=<dbname> < ~/backup/<dbname>.dump

Восстановление обычного текстового дампа базы данных PostgreSQL аналогично восстановлению дампа MySQL. Мы выдаем файл дампа командой cat и передаем вывод команде «docker exec» с опцией «-interactive». Внутри контейнера выполняется команда psql, которая обрабатывает SQL-команды и перестраивает базу данных.

cat ~/backup/<dbname>.sql | docker exec --interactive <container-id> psql --user=root --password=<password> <dbname>

Оцените статью
cdelat.ru
Добавить комментарий