Перенос данных Docker Volumes на другой сервер: архивация и импорт
Сложность миграции данных в Docker
При переносе проектов на новый сервер многие новички просто копируют файл docker-compose.yml и запускают его. Но сам контейнер является временным (stateless), а все реальные данные (базы данных PostgreSQL, MySQL, загруженные пользователями файлы) хранятся в специальных именованных томах Docker Volumes в каталоге /var/lib/docker/volumes/. Без переноса этих томов на новом сервере проект поднимется с абсолютно пустой базой данных.
Схема корректной миграции:
Сервер А (Остановка контейнера) ---> Архивация Volume (tar) ---> Передача по SSH (rsync) ---> Сервер Б (Распаковка) Пошаговый перенос тома (на примере db_data)
Шаг 1. Находим точное имя тома на исходном Сервере А
docker volume ls(Предположим, наш том называется
my_project_db_data).Шаг 2. Останавливаем контейнер для сохранения целостности
Критически важно: Всегда останавливайте контейнер перед архивацией тома, чтобы в файл не попали полузаписанные транзакции базы данных!
docker stop my_db_containerШаг 3. Упаковываем Volume в единый архив tar
Самый безопасный способ архивации через временный служебный контейнер:
docker run --rm -v my_project_db_data:/volume -v $(pwd):/backup alpine tar -czvf /backup/volume_backup.tar.gz -C /volume .В текущей папке появится готовый архив
volume_backup.tar.gz.Шаг 4. Передаем архив на новый Сервер Б по сети
rsync -avz volume_backup.tar.gz root@IP_НОВОГО_СЕРВЕРА:/tmp/Шаг 5. Восстанавливаем том на новом Сервере Б
Подключитесь к новому Серверу Б, создайте пустой том с таким же именем и распакуйте архив:
# Создаем чистый volume: docker volume create my_project_db_data # Распаковываем архив прямо внутрь созданного тома: docker run --rm -v my_project_db_data:/volume -v /tmp:/backup alpine sh -c "rm -rf /volume/* && tar -xzvf /backup/volume_backup.tar.gz -C /volume"Шаг 6. Запускаем проект на новом сервере
docker compose up -d
Частые вопросы (FAQ)
Можно ли просто скопировать папку /var/lib/docker/volumes обычным cp?
Прямое копирование через cp может нарушить права доступа файлов, символические ссылки и структуру метаданных Docker. Использование временного контейнера с alpine гарантирует 100% сохранение структуры.
Где физически лежат файлы внутри тома на диске Linux?
Они находятся по пути /var/lib/docker/volumes/<VOLUME_NAME>/_data/.
Как перенести анонимные тома (Anonymous Volumes)?
Анонимные тома имеют длинные 64-значные хэш-имена. Их также можно архивировать по их ID, но в production рекомендуется всегда давать томам понятные имена в docker-compose.yml.
Нужно ли удалять временный архив после успешного переноса?
Да, после проверки работоспособности проекта удалите промежуточный архив: rm /tmp/volume_backup.tar.gz.