Как мигрировать тома Docker на другой хост

DockerBeginner
Практиковаться сейчас

Введение

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

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

Понимание и создание томов Docker

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

Что такое тома Docker?

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

Некоторые ключевые преимущества томов Docker включают в себя:

  • Сохранение данных на протяжении жизненного цикла контейнера
  • Возможность обмена данными между контейнерами
  • Лучшая производительность, чем файловая система контейнера
  • Независимое управление от контейнеров

Создание вашего первого тома Docker

Давайте начнем с создания простого тома Docker:

docker volume create my-data-volume

При выполнении этой команды Docker создаст новый том с именем my-data-volume. Вы должны увидеть имя тома, напечатанное в терминале:

my-data-volume

Вы можете вывести список всех томов Docker в вашей системе с помощью следующей команды:

docker volume ls

Это отобразит таблицу со всеми томами:

DRIVER    VOLUME NAME
local     my-data-volume

Инспектирование тома Docker

Чтобы получить больше информации о вашем томе, используйте команду inspect:

docker volume inspect my-data-volume

Вы увидите подробную информацию о томе в формате JSON:

[
  {
    "CreatedAt": "2023-10-01T12:34:56Z",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my-data-volume/_data",
    "Name": "my-data-volume",
    "Options": {},
    "Scope": "local"
  }
]

Обратите внимание на значение Mountpoint - это место, где Docker хранит данные тома в хост-системе.

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

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

docker run --name my-container -v my-data-volume:/data ubuntu /bin/bash -c "echo 'Hello from Docker volume' > /data/test.txt"

Эта команда:

  • Создает контейнер с именем my-container
  • Монтирует my-data-volume в каталог /data внутри контейнера
  • Выполняет простую команду для записи текста в файл в этом каталоге

Давайте проверим, были ли данные записаны в том, создав другой контейнер, который монтирует тот же том:

docker run --rm -v my-data-volume:/data ubuntu cat /data/test.txt

Вы должны увидеть вывод:

Hello from Docker volume

Это демонстрирует, что данные сохраняются в томе и могут быть доступны разными контейнерами.

Подготовка к миграции тома

Прежде чем мигрировать том Docker на другой хост, нам нужно подготовить наши исходные данные и понять процесс миграции. На этом этапе мы добавим больше данных в наш том и подготовим его к миграции.

Добавление большего количества данных в том

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

docker run --name data-generator -v my-data-volume:/data ubuntu /bin/bash -c "mkdir -p /data/config && echo 'database_url=postgres://user:password@db:5432/mydb' > /data/config/settings.conf && echo 'This is important data' > /data/important.txt"

Эта команда создает каталоги и файлы с примером содержимого в нашем томе.

Давайте проверим структуру данных в нашем томе:

docker run --rm -v my-data-volume:/data ubuntu ls -la /data

Вы должны увидеть вывод, похожий на:

total 12
drwxr-xr-x 3 root root 4096 Oct  1 12:34 .
drwxr-xr-x 1 root root 4096 Oct  1 12:34 ..
drwxr-xr-x 2 root root 4096 Oct  1 12:34 config
-rw-r--r-- 1 root root   21 Oct  1 12:34 important.txt
-rw-r--r-- 1 root root   24 Oct  1 12:34 test.txt

Давайте также проверим содержимое одного из наших файлов:

docker run --rm -v my-data-volume:/data ubuntu cat /data/important.txt

Вывод:

This is important data

Понимание подходов к миграции томов

Существует несколько подходов к миграции томов Docker:

  1. Прямое копирование с хоста на хост: Прямое копирование данных тома между хостами
  2. Резервное копирование и восстановление: Создание архивной копии и ее восстановление на новом хосте
  3. Использование плагинов Docker: Некоторые плагины хранения имеют встроенные функции репликации

Для этой лабораторной работы мы будем использовать подход резервного копирования и восстановления, который работает в большинстве сред и не требует специальных плагинов.

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

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

docker run --rm -v my-data-volume:/source -v $(pwd):/backup ubuntu tar cvf /backup/my-data-volume-backup.tar -C /source .

Эта команда:

  • Монтирует наш том в /source в контейнере
  • Монтирует текущий каталог в /backup в контейнере
  • Создает tar-архив всего в каталоге /source и сохраняет его в /backup/my-data-volume-backup.tar

Убедитесь, что файл резервной копии был создан:

ls -lh my-data-volume-backup.tar

Вы должны увидеть что-то вроде:

-rw-r--r-- 1 labex labex 10K Oct  1 12:34 my-data-volume-backup.tar

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

tar -tf my-data-volume-backup.tar

Вывод должен включать:

./
./config/
./config/settings.conf
./important.txt
./test.txt

Теперь, когда мы создали резервную копию нашего тома, мы готовы смоделировать его миграцию на новый хост.

Симуляция миграции тома на новый хост

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

Симуляция среды нового хоста

Во-первых, давайте очистим наши старые контейнеры, чтобы смоделировать переход в новую среду:

docker rm -f my-container data-generator

Теперь давайте удалим наш исходный том, чтобы смоделировать начало работы с чистого листа на новом хосте:

docker volume rm my-data-volume

Создайте новый том, который будет представлять наш том на «новом хосте»:

docker volume create my-new-host-volume

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

Теперь мы восстановим нашу резервную копию в новый том:

docker run --rm -v my-new-host-volume:/destination -v $(pwd):/backup ubuntu bash -c "cd /destination && tar xvf /backup/my-data-volume-backup.tar"

Эта команда:

  • Создает временный контейнер
  • Монтирует наш новый том в /destination
  • Монтирует текущий каталог (где находится наша резервная копия) в /backup
  • Извлекает tar-архив в каталог /destination

Проверка восстановленных данных

Давайте проверим, что все наши данные были правильно восстановлены в новый том:

docker run --rm -v my-new-host-volume:/data ubuntu ls -la /data

Вы должны увидеть ту же структуру файлов, что и раньше:

total 12
drwxr-xr-x 3 root root 4096 Oct  1 12:34 .
drwxr-xr-x 1 root root 4096 Oct  1 12:34 ..
drwxr-xr-x 2 root root 4096 Oct  1 12:34 config
-rw-r--r-- 1 root root   21 Oct  1 12:34 important.txt
-rw-r--r-- 1 root root   24 Oct  1 12:34 test.txt

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

docker run --rm -v my-new-host-volume:/data ubuntu cat /data/important.txt

Вывод:

This is important data

Также проверьте файл конфигурации:

docker run --rm -v my-new-host-volume:/data ubuntu cat /data/config/settings.conf

Вывод:

database_url=postgres://user:password@db:5432/mydb

Использование восстановленного тома с новым контейнером

Теперь, когда мы успешно «мигрировали» наш том, давайте использовать его с новым контейнером:

docker run --name my-new-container -v my-new-host-volume:/app/data -d nginx

Это создает новый контейнер Nginx, который монтирует наш восстановленный том в /app/data.

Давайте проверим, что контейнер может получить доступ к данным тома:

docker exec my-new-container ls -la /app/data

Вы должны увидеть те же файлы, что и раньше, подтверждая, что миграция прошла успешно.

Обновление приложений для использования нового тома

В реальном сценарии, после миграции томов на новый хост, вам потребуется обновить файлы Docker Compose или команды запуска контейнера, чтобы использовать новые имена или пути томов. Например, если вы используете Docker Compose, вы можете обновить свой файл docker-compose.yml следующим образом:

version: "3"
services:
  webapp:
    image: nginx
    volumes:
      - my-new-host-volume:/app/data
volumes:
  my-new-host-volume:
    external: true

Это указывает Docker использовать внешне созданный том с именем my-new-host-volume.

Процесс миграции завершен! Вы успешно:

  1. Создали том Docker и добавили в него данные
  2. Создали резервную копию данных тома
  3. Создали новый том на смоделированном «новом хосте»
  4. Восстановили данные резервной копии в новый том
  5. Проверили целостность данных
  6. Подключили новый контейнер к мигрированному тому

Рекомендации и продвинутые методы миграции

Теперь, когда вы понимаете основы миграции томов Docker, давайте рассмотрим некоторые рекомендации и продвинутые методы, чтобы сделать ваши миграции томов более эффективными и надежными.

Планирование миграции томов

При планировании миграции томов учитывайте следующие факторы:

  1. Размер тома: Передача больших томов занимает больше времени и может потребовать особого подхода.
  2. Требования к времени простоя: Определите, сколько времени простоя может выдержать ваше приложение.
  3. Конфиденциальность данных: Убедитесь, что конфиденциальные данные должным образом защищены во время передачи.
  4. Пропускная способность сети: Учитывайте доступную пропускную способность между хостами.

Автоматизация процесса миграции

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

nano migrate-volume.sh

Добавьте следующее содержимое в скрипт:

#!/bin/bash
## Простой скрипт миграции томов Docker

if [ $## -ne 2 ]; then
  echo "Использование: $0 <исходный_том> <целевой_том>"
  exit 1
fi

SOURCE_VOLUME=$1
DEST_VOLUME=$2
BACKUP_FILE="/tmp/${SOURCE_VOLUME}-backup.tar"

echo "Создание резервной копии ${SOURCE_VOLUME}..."
docker run --rm -v ${SOURCE_VOLUME}:/source -v /tmp:/backup ubuntu tar cf /backup/${SOURCE_VOLUME}-backup.tar -C /source .

echo "Создание целевого тома ${DEST_VOLUME}..."
docker volume create ${DEST_VOLUME}

echo "Восстановление резервной копии в ${DEST_VOLUME}..."
docker run --rm -v ${DEST_VOLUME}:/destination -v /tmp:/backup ubuntu bash -c "cd /destination && tar xf /backup/${SOURCE_VOLUME}-backup.tar"

echo "Миграция завершена. Проверка содержимого тома..."
docker run --rm -v ${DEST_VOLUME}:/data ubuntu ls -la /data

echo "Готово!"

Сохраните файл (Ctrl+O, затем Enter) и выйдите (Ctrl+X).

Сделайте скрипт исполняемым:

chmod +x migrate-volume.sh

Теперь вы можете мигрировать тома одной командой:

./migrate-volume.sh my-new-host-volume another-volume

Это создаст резервную копию my-new-host-volume, создаст новый том с именем another-volume и восстановит в него резервную копию.

Работа с большими томами

Для больших томов базовый подход с использованием tar может быть неэффективным. Вот несколько альтернатив:

  1. Инкрементные резервные копии: Передавайте только изменения с момента последней резервной копии.
  2. Сжатие: Используйте сжатие для уменьшения размера резервной копии.
  3. Прямое копирование: Используйте rsync для прямого копирования между хостами.

Давайте реализуем подход со сжатым резервным копированием:

docker run --rm -v my-new-host-volume:/source -v $(pwd):/backup ubuntu tar czf /backup/compressed-backup.tar.gz -C /source .

Опция z, добавленная к tar, включает сжатие, что приводит к созданию меньшего файла резервной копии. Это особенно полезно для данных, содержащих много текста.

Для восстановления из сжатой резервной копии:

docker volume create compressed-volume
docker run --rm -v compressed-volume:/destination -v $(pwd):/backup ubuntu bash -c "cd /destination && tar xzf /backup/compressed-backup.tar.gz"

Миграция томов в производственных средах

В производственных средах вы можете рассмотреть следующие дополнительные подходы:

  1. Репликация драйвера хранилища: Некоторые драйверы хранилищ поддерживают встроенную репликацию.
  2. Плагины томов Docker: Используйте специализированные плагины для вашей системы хранения.
  3. Резервное копирование баз данных: Для томов баз данных используйте собственные инструменты резервного копирования базы данных.
  4. Плановые миграции: Используйте такие инструменты, как cron, для планирования регулярных резервных копий.

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

Резюме

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

  • Созданием и управлением томами Docker
  • Добавлением и доступом к данным в томах Docker
  • Резервным копированием данных тома с помощью команды tar
  • Восстановлением данных тома на новом хосте
  • Проверкой целостности данных после миграции
  • Созданием скриптов автоматизации для миграции томов
  • Обработкой различных сценариев миграции, включая большие тома

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