Skip to content

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

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

1. Резервное копирование и восстановление образов

Docker-образы обычно хранятся в Docker Registry (например, Docker Hub или частном реестре), поэтому в большинстве случаев нет необходимости в их ручном резервном копировании. Вы можете просто загрузить образ (docker pull) с реестра при необходимости.

Однако, если вам нужно сохранить образ локально (например, перед удалением из локального хранилища), вы можете использовать команды docker save и docker load.

Резервное копирование образа (docker save)

Команда docker save позволяет сохранить один или несколько образов в tar-архив.

bash
docker save -o my_image.tar my_image:latest
docker save -o multiple_images.tar image1:tag1 image2:tag2

Флаг -o указывает имя выходного файла.

Восстановление образа (docker load)

Команда docker load позволяет загрузить образ(ы) из tar-архива, созданного с помощью docker save.

bash
docker load -i my_image.tar
docker load < multiple_images.tar

Флаг -i указывает имя входного файла. Если флаг не указан, Docker ожидает данные на стандартном вводе.

2. Резервное копирование и восстановление контейнеров

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

Однако, в некоторых случаях (например, для отладки или миграции), может потребоваться сохранить состояние контейнера. Для этого можно использовать команды docker export и docker import или docker commit.

Экспорт файловой системы контейнера (docker export)

Команда docker export позволяет экспортировать файловую систему работающего или остановленного контейнера в tar-архив.

bash
docker export my_container > my_container.tar

Импорт файловой системы как образ (docker import)

Команда docker import позволяет создать новый образ из tar-архива, созданного с помощью docker export, или из URL-адреса.

bash
docker import my_container.tar my_image:imported
docker import --change 'ENV MY_VAR=my_value' [http://example.com/image.tgz](http://example.com/image.tgz) my_remote_image:latest

Опция --change позволяет применять инструкции Dockerfile (например, ENV, USER, WORKDIR) во время импорта.

Создание образа из изменений контейнера (docker commit)

Команда docker commit позволяет создать новый образ из текущего состояния работающего контейнера (включая внесенные изменения).

bash
docker commit my_running_container my_new_image:v1

Важно понимать, что docker export и docker commit не сохраняют метаданные контейнера, такие как запущенные процессы, настройки сети или тома. Рекомендуется использовать эти команды с осторожностью и в основном для отладки или создания базовых образов.

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

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

Использование сторонних инструментов

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

Ручное резервное копирование с помощью контейнера

Вы можете запустить временный контейнер, который монтирует целевой том и том для резервного копирования (например, локальную директорию или другой том), а затем использовать стандартные инструменты (например, tar, rsync) для копирования данных.

Резервное копирование именованного тома в локальную директорию:

bash
docker run --rm -v my_data_volume:/data -v $(pwd)/backup:/backup ubuntu tar cvf /backup/my_data_backup.tar /data

Эта команда запускает временный контейнер Ubuntu, монтирует том my_data_volume в /data внутри контейнера и локальную директорию $(pwd)/backup в /backup. Затем команда tar создает архив данных тома в локальной директории.

Восстановление именованного тома из локальной директории:

bash
docker run --rm -v my_data_volume:/data -v $(pwd)/backup:/backup ubuntu tar xvf /backup/my_data_backup.tar -C /data

Эта команда запускает временный контейнер Ubuntu и распаковывает архив из локальной директории в том my_data_volume.

Резервное копирование именованного тома в другой том:

bash
docker run --rm -v my_data_volume:/data -v backup_volume:/backup ubuntu tar cvf /backup/my_data_backup.tar /data

Восстановление именованного тома из другого тома:

bash
docker run --rm -v my_data_volume:/data -v backup_volume:/backup ubuntu tar xvf /backup/my_data_backup.tar -C /data

Использование Docker Compose для резервного копирования томов

Вы можете определить сервисы в docker-compose.yml для резервного копирования и восстановления томов.

Пример docker-compose.yml для резервного копирования тома my_data:

yaml
version: '3.9'
services:
  backup:
    image: ubuntu
    volumes:
      - my_data:/data:ro
      - ./backup:/backup
    command: tar cvfz /backup/my_data_$(date +%Y%m%d).tar.gz /data

volumes:
  my_data:

Запуск резервного копирования: docker-compose run --rm backup

Пример docker-compose.yml для восстановления тома my_data из файла backup/my_data_latest.tar.gz:

yaml
version: '3.9'
services:
  restore:
    image: ubuntu
    volumes:
      - my_data:/data
      - ./backup:/backup:ro
    command: tar xvfz /backup/my_data_latest.tar.gz -C /data

volumes:
  my_data:

Запуск восстановления: docker-compose run --rm restore

Резервное копирование монтирований хост-директорий

Если вы используете монтирования хост-директорий (bind mounts), резервное копирование и восстановление данных осуществляется стандартными инструментами операционной системы на хост-машине (например, cp, rsync, tar). Docker в этом случае не управляет данными.

Стратегии резервного копирования

  • Регулярность: Определите расписание резервного копирования в зависимости от частоты изменения данных и требований к восстановлению (RPO - Recovery Point Objective).
  • Автоматизация: Автоматизируйте процесс резервного копирования с помощью cron-задач или специализированных инструментов.
  • Внешнее хранилище: Храните резервные копии в отдельном месте (например, на другом диске, сетевом хранилище или в облаке), чтобы защититься от сбоя локального оборудования.
  • Тестирование восстановления: Регулярно проверяйте процесс восстановления, чтобы убедиться, что резервные копии работоспособны и вы сможете восстановить данные за приемлемое время (RTO - Recovery Time Objective).
  • Инкрементное резервное копирование: Для больших объемов данных рассмотрите возможность использования инкрементного резервного копирования, чтобы сохранять только изменения с момента последнего полного резервного копирования, что экономит место и время.

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