Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

Linux / DevOps

Перенос данных Docker Volumes на другой сервер: архивация и импорт

Обновлено: 27.08.2026 · Официальная документация ↗

Сложность миграции данных в Docker

При переносе проектов на новый сервер многие новички просто копируют файл docker-compose.yml и запускают его. Но сам контейнер является временным (stateless), а все реальные данные (базы данных PostgreSQL, MySQL, загруженные пользователями файлы) хранятся в специальных именованных томах Docker Volumes в каталоге /var/lib/docker/volumes/. Без переноса этих томов на новом сервере проект поднимется с абсолютно пустой базой данных.

Схема корректной миграции:

Сервер А (Остановка контейнера) ---> Архивация Volume (tar) ---> Передача по SSH (rsync) ---> Сервер Б (Распаковка)

Пошаговый перенос тома (на примере db_data)

  1. Шаг 1. Находим точное имя тома на исходном Сервере А

    docker volume ls

    (Предположим, наш том называется my_project_db_data).

  2. Шаг 2. Останавливаем контейнер для сохранения целостности

    Критически важно: Всегда останавливайте контейнер перед архивацией тома, чтобы в файл не попали полузаписанные транзакции базы данных!

    docker stop my_db_container
  3. Шаг 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. Шаг 4. Передаем архив на новый Сервер Б по сети

    rsync -avz volume_backup.tar.gz root@IP_НОВОГО_СЕРВЕРА:/tmp/
  5. Шаг 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. Шаг 6. Запускаем проект на новом сервере

    docker compose up -d
💡 Практика специалистов: При миграции Production-баз данных (PostgreSQL/MySQL) двойным золотым стандартом является не только перенос физического тома docker volume, но и параллельное снятие логического текстового дампа (pg_dump / mysqldump). Это гарантирует восстановление даже при несовместимости версий СУБД.

Частые вопросы (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.

Полезные материалы
Рекомендуем