Перенос volumes docker на другой сервер

05 10 2024

Некоторые контейнеры docker требуют для работы использовать виртуальные папки volumes вместо обычного монтирования (например Grafana, Prometheus). Обычно это задается таким образом

...
	volumes:
      - prometheus_data:/prometheus
...
volumes:
  prometheus_data: {}

Создание бэкапа

Перед созданием бэкапа остановить работу контейнера для исключения ошибок записи файлов.

Вывести список существующих томов данных:

docker volume ls

Создание бэкапа тома данных:

docker run --rm -v <volumes_name>:/volume -v $(pwd):/backup busybox tar czf /backup/<volumes_name>.tar.gz -C /volume .

Восстановление из бэкапа

Восстановление необходимо выполнить до запуска контейнера, или удалить созданный ранее том данных.

Создадим volumes

docker volume create <volume_name>

Docker volumes хранятся в /var/lib/docker/volumes/ по умолчанию. Найдите путь к вашему volume:

docker volume inspect <volume_name>

Ищите в выводе ключ Mountpoint, который указывает на путь к данному volume. Это обычно /var/lib/docker/volumes/<volume_name>/_data.

Распаковка архива

sudo tar -xzvf volume_backup.tar.gz -C /var/lib/docker/volumes/<volume_name>/_data

Необязательно проверка и изменение прав на данные (может потребоваться если запускалась распаковка не через sudo)

sudo chown -R root:root /var/lib/docker/volumes/<volume_name>/_data
sudo chmod -R 755 /var/lib/docker/volumes/<volume_name>/_data

После этого можно выполнить запуск контейнера.