Чтобы не потерять данные накопленные в процессе работы, необходимо создавать резервные копии контейнеров Docker, а самое главное томов (volumes) Docker, которые сохраняют данные контейнера. Обычно резервная копия контейнера создается с помощью docker commit
. Это позволит создать новый образ из контейнера, а затем эти образы можно отправить в реестры Docker для хранения снимков состояния контейнера.
Чтобы полностью создать резервную копию и восстановить Docker, выполните следующие действия:
- Создайте резервную копию и восстановите том контейнера Docker
- Создайте резервную копию контейнера Docker
- Восстановите контейнер Docker Из резервной копии Образа
Поскольку docker commit
не включает резервное копирование тома Docker.
Поэтому пользователям необходимо создавать резервные копии тома отдельно.
Для этого выполните следующие действия.
Создайте новый контейнер
Чтобы создать резервную копию тома, сначала создайте новый контейнер. Например, мы создали контейнер «backup-cont». Здесь опция «-v» используется для подключения внешнего тома к контейнеру Docker:
docker run -d -v demo-vol:/usr/share/nginx/ --name backup-cont demo-img
Создайте резервную копию тома
Теперь создайте резервную копию тома Docker, подключенного к контейнеру backup-cont
, с помощью приведенной ниже команды. В указанной команде мы создадим файл backup.tar
в текущем открытом каталоге:
docker run --rm --volumes-from backup-cont -v $(pwd):/backup nginx tar cvf /backup/backup.tar /usr/share/nginx
В этой команде
- —rm: Автоматически удаляет контейнер при его извлечении.
- -v my_volume:/data: Это позволяет подключить том к /data внутри контейнера.
- -v $(pwd):/backup: Монтирует текущий каталог в /backup в контейнере, где находится файл резервной копии.
- tar cvf /backup/backup.tar /data: Это создает архив в формате tar из каталога /data с данными тома и помещает его в /backup.
Для подтверждения выведите список файлов и папок в рабочем каталоге.
Здесь вы можете видеть, что мы создали резервную копию тома в файле backup.tar
:
dir
Восстановите volume
Чтобы восстановить том Docker в среде Docker, используйте следующую команду. Эта команда восстановит том из файла backup.tar
, созданного на предыдущем шаге:
docker run --rm --volumes-from backup-cont -v %cd%:/backup bash -c "cd /usr/share/nginx && tar xvf /backup/backup.tar"
Резервное копирование с помощью Docker-volume-backup
В открытом доступе есть проект Docker-volume-backup (https://github.com/offen/docker-volume-backup), значительно упрощающий резервное копирование томов Docker. Данный легкий образ (около 15 мб) позволяет подключаться к любому volume в docker и выполнять резервное копирование файлов в локальную директорию, S3-совместимое хранилище (AWS S3, MimIO, Ceph и т.д.), или отправить сохранить его на удаленное устройства через WebDAV или по SSH.
Чтобы быстро выполнить однократное резервное копирование данных из тома docker, можно выполнить:
docker run --rm \ -v data:/backup/data \ --env AWS_ACCESS_KEY_ID="" \ --env AWS_SECRET_ACCESS_KEY="" \ --env AWS_S3_BUCKET_NAME="" \ --entrypoint backup \ offen/docker-volume-backup:v2
Если нужно выполнить резервное копирование по SSH:
docker run --rm \ -v data:/backup/data \ --env SSH_HOST_NAME="backupsrv1.local" \ --env SSH_PORT=2222 \ --env SSH_REMOTE_PATH="/mnt/backup/" \ --env SSH_USER="user" --env SSH_PASSWORD="password" --entrypoint backup \ offen/docker-volume-backup:v2
Можно собрать отдельный образ для резервного копирования через docker-compose:
version: '3' services: backup: image: offen/docker-volume-backup:latest environment: BACKUP_CRON_EXPRESSION: "0 * * * *" BACKUP_PRUNING_PREFIX: backup- BACKUP_RETENTION_DAYS: 7 AWS_BUCKET_NAME: backup-bucket AWS_ACCESS_KEY_ID: AWS_SECRET_ACCESS_KEY: volumes: - data:/backup/my-app-backup:ro - /var/run/docker.sock:/var/run/docker.sock:ro volumes: data:
Перед бэкапом можно выполнить произвольные команды внутри контейнера. Например, сделать дамп базы данных (например, если вы выполняете бэкап Zabbix Server) или ещё что-то.