Как создавать резервные копии томов Docker
Life-Hack [Жизнь-Взлом]/ХакингТома Docker используются для хранения постоянных данных отдельно от контейнеров.
Данные, хранящиеся в томе, остаются доступными после остановки контейнеров.
Необходимо создавать резервные копии томов, чтобы их можно было восстановить после сбоев.
Создание регулярных резервных копий томов гарантирует, что вы сможете восстановить свою среду, если ваш хост Docker будет взломан или данные будут случайно удалены.
Управление резервным копированием томов
Docker не имеет встроенного механизма для резервного копирования томов или экспорта их содержимого.
Вам необходимо создать собственное решение для доступа к тому и копирования его данных в место назначения
Обычно проще всего создать временный контейнер, в котором будет смонтирован том, который вам нужно резервировать.
Добавьте флаг –volumes-from в команду docker run, чтобы автоматически смонтировать тома существующего контейнера в контейнер резервного копирования.
Затем вы можете использовать такие инструменты, как tar и gzip, чтобы поместить архив содержимого тома в ваш рабочий каталог.
Вот полный пример этой техники:
Создайте контейнер, хранящий данные в томе "mysql_data". doc
Флаг –volumes-from означает, что временный контейнер резервного копирования получает доступ к томам контейнера mysql.
Каталог /var/lib/mysql внутри контейнера резервного копирования раскрывает содержимое тома, поскольку это путь, используемый контейнером mysql.
Если страррить этот путь, будет создан архив тома, который можно использовать в качестве резервной копии.
Он будет помещен в ваш рабочий каталог благодаря bind mount, установленному флагом -v.
Флаг –rm удалит резервный контейнер сразу после завершения команды.
В результате архив останется в рабочем каталоге, готовый к перемещению в долговременное хранилище.
Вы можете автоматизировать создание резервной копии, добавив команду docker run в качестве задачи cron.
Восстановление резервной копии
Для восстановления резервной копии можно использовать аналогичную технику.
При замене содержимого существующего тома создайте другой временный контейнер с томом и привязкой монтирования к архиву резервной копии.
Извлеките содержимое архива в путь монтирования тома.
docker run --rm \ --volumes-from mysql -v $PWD:/backup-dir bash -c "cd /var/lib/mysql && tar xvf /backup-dir/mysql-backup.tar"
Это может быть рискованно, если контейнеры активно используют том.
Перезапись используемых файлов может привести к ошибкам и неожиданному поведению.
Вы можете использовать команду docker stop для временной остановки контейнеров, прежде чем вернуть их в исходное состояние с помощью команды docker start.
docker stop mysql docker start mysql
Создайте том до запуска контейнера, если вы восстанавливаете резервную копию на новый хост:
docker volume create new_volume
Затем смонтируйте этот том с вашим временным контейнером:
docker run --rm \ -v new_volume:/var/lib/mysql -v $PWD:/backup-dir \ ubuntu tar cvf /backup-dir/mysql-backup.tar /var/lib/mysql
Запуск контейнера приложения с тем же томом обеспечит доступ к восстановленным файлам:
docker run -d \ --name mysql \ -v new_volume:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=mysql \ mysql:8
Тестирование этих процедур позволит вам убедиться в том, что ваши резервные копии можно будет использовать, если вы столкнетесь со сбоями.
Резервное копирование томов напрямую
Процедура, описанная выше, является рекомендуемым способом резервного копирования томов Docker.
Однако в некоторых ситуациях лучше использовать прямое копирование содержимого томов из файловой системы хоста.
Обычно содержимое томов находится в каталоге /var/lib/docker/volumes.
Каждый том получает свой собственный подкаталог, например /var/lib/docker/volumes/mysql.
Внутри этого пути верхнего уровня вы найдете папку _data, которая содержит все файлы, хранящиеся внутри тома.
Архивирование каталога /var/lib/docker/volumes может быть удобным способом быстрого резервного копирования всех данных на вашем хосте.
Однако вам придется использовать sudo, поскольку все, что находится по этому пути, принадлежит root.
Резервное копирование томов таким способом не рекомендуется для регулярного использования, поскольку оно не переносится между установками.
Система драйверов томов Docker означает, что данные тома не обязательно будут храниться в файловой системе вашего хоста – они могут находиться на сетевом ресурсе или в другом удаленном месте.
Этот метод следует использовать только в тех случаях, когда вам нужно быстро создать резервную копию перед проведением технического обслуживания на конкретной машине.
Заключение
С томами Docker нужно обращаться осторожно, поскольку они содержат постоянные данные вашего приложения.
Создание регулярных резервных копий защитит вас от потери данных в случае взлома хоста или ошибочного удаления файлов контейнерным процессом.
Хотя вы можете создавать резервные копии путем архивирования каталога установки Docker, этого следует избегать, когда это возможно.
Временные контейнеры резервного копирования могут показаться громоздкими, но они легко создаются с помощью скриптов и обеспечивают предсказуемые результаты для всех драйверов томов.
После создания архива резервных копий томов не забудьте как можно скорее загрузить его в удаленное хранилище.
Резервная копия, хранящаяся на машине, с которой она была создана, не поможет, если вы потеряете доступ или произойдет сбой оборудования.