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

Некоторые контейнеры 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

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