Поиск по сайту:

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


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

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

Управление резервными копиями томов

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

Создание временного контейнера, который монтирует том, для которого требуется резервное копирование, обычно является самым простым способом. Добавьте флаг --volumes-from в команду docker run, чтобы автоматически монтировать тома существующего контейнера в контейнер резервного копирования. Затем вы можете использовать такие инструменты, как tar и gzip, чтобы поместить архив содержимого тома в ваш рабочий каталог.

Вот полный пример этой техники:

# Create a container that stores data in the "mysql_data" volume
docker run -d \
    --name mysql \
    -v mysql_data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=mysql \
    mysql:8

# Start a temporary container to back up the "mysql_data" volume
docker run --rm \
    --volumes-from mysql
    -v $PWD:/backup-dir \
    ubuntu tar cvf /backup-dir/mysql-backup.tar /var/lib/mysql

Флаг --volumes-from означает, что контейнер временных резервных копий получает доступ к томам контейнера mysql. Каталог /var/lib/mysql внутри контейнера резервного копирования предоставляет доступ к содержимому тома, поскольку этот путь используется контейнером mysql. Смолирование пути создаст архив вашего тома, который вы можете использовать в качестве резервной копии. Он помещается в ваш рабочий каталог из-за монтирования привязки, настроенного флагом -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

# Restore the backup
# ...

$ 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, по возможности этого следует избегать. Временные контейнеры резервных копий могут показаться громоздкими, но их можно легко создать с помощью сценариев, и они обеспечивают предсказуемые результаты для драйверов томов.

Создав архив резервной копии тома, не забудьте как можно скорее загрузить его в удаленное хранилище. Резервная копия, хранящаяся на машине, с которой она создана, не поможет, если вы потеряете доступ или произойдет аппаратный сбой.