На Mac с Docker Desktop создайте резервную копию именованного тома Compose, подключив его к временному контейнеру и записав tar-архив в папку на вашем Mac. Проверьте имя тома, остановите службы, которые ведут в него запись, создайте архив и убедитесь, что файл существует, прежде чем удалять контейнеры. Обычная команда docker compose down сохраняет именованные тома; docker compose down --volumes удаляет подходящие тома проекта, поэтому не запускайте ее до завершения резервного копирования.
1. Определите том Compose и путь его монтирования
В Terminal перейдите в каталог, содержащий файл Compose вашего проекта. Найдите точку монтирования службы, например db-data:/var/lib/postgresql/data, и соответствующее объявление верхнего уровня в разделе volumes:. Слева находится ключ Compose (db-data); путь контейнера после двоеточия — это место, где данные видит приложение. Compose может создать фактический том Docker с префиксом проекта, в то время как настроенный параметр name: позволяет задать ему пользовательское имя. В справочнике по томам Docker Compose описаны эти правила именования.
Выведите список томов, используемых текущим проектом Compose:
docker compose volumes
Используйте этот вывод и файл Compose, чтобы определить точное имя тома Docker. Если в проекте используется несколько файлов Compose, профили или пользовательское имя проекта, используйте те же параметры при проверке, что и при запуске стека. Не угадывайте фактическое имя тома только по ключу YAML. Команда docker volume ls может показать все тома Docker, но в этот список могут входить несвязанные проекты.
2. Остановите операции записи перед созданием архива
Архив файловой системы не обязательно является согласованной резервной копией базы данных, если база данных изменяется во время копирования файлов. Сначала корректно остановите приложение; для стека Compose команда docker compose stop останавливает его службы, сохраняя контейнеры и тома. Если для базы данных предусмотрена специфическая процедура дампа или резервного копирования, используйте ее, когда важна согласованность на уровне транзакций, а затем создайте архив тома, если вам также нужна копия на уровне файлов.
Избегайте использования docker compose down --volumes на этом этапе. В документации Compose указано, что команда down по умолчанию удаляет контейнеры и сети проекта, тогда как флаг --volumes также удаляет подходящие именованные и анонимные тома. Внешние тома (external) командой down не удаляются. В справочнике по compose down от Docker подробно объясняется эта разница.
3. Создайте резервную копию tar в папке на Mac
В следующем примере предполагается, что фактический том Docker называется myproject_db-data. Замените это значение на точное имя, которое вы определили. Архив db-data-backup.tar сохранится в текущем каталоге на Mac. Docker Desktop запускает Docker Engine внутри виртуальной машины Linux, поэтому данные именованного тома управляются Docker; этот метод копирует их через временный контейнер вместо обращения напрямую к пути хранилища ВМ Linux. В руководстве по томам Docker описан подход с использованием вспомогательного контейнера и tar, а в документации по настройкам Docker Desktop для Mac описаны виртуальная машина Linux и общий доступ к файлам хоста.
volume_name='myproject_db-data'
backup_dir="$PWD"
backup_file='db-data-backup.tar'
docker run --rm \
--mount "type=volume,source=$volume_name,target=/source,readonly" \
--mount "type=bind,source=$backup_dir,target=/backup" \
alpine sh -c 'tar -C /source -cf "/backup/'"$backup_file"'" .'
Архив записывается в каталог, представленный переменной $PWD, поэтому перед выполнением команды выберите расположение с достаточным объемом свободного места. Том монтируется во вспомогательный контейнер в режиме «только для чтения», чтобы предотвратить случайные изменения во время копирования; само по себе это не блокирует запись из других контейнеров, именно поэтому предварительная остановка процессов записи имеет важное значение. Для выполнения команды требуется, чтобы Docker Desktop был запущен, а папка на Mac была доступна для монтирования привязок (bind mounts). Если монтирование завершилось ошибкой, проверьте права общего доступа к файлам (file sharing) для этой папки в настройках Docker Desktop.
Убедитесь, что архив существует и имеет правдоподобный ненулевой размер:
ls -lh "$backup_file"
Это лишь подтверждает, что файл был создан, но не гарантирует, что его содержимое представляет собой восстанавливаемую резервную копию приложения. Сохраните архив за пределами управляемого Docker тома и рассмотрите возможность его копирования в обычное место хранения резервных копий перед удалением данных.
4. Удаляйте контейнеры только после проверки результата
Когда архив будет готов, удалите контейнеры проекта с помощью команды:
docker compose down
По умолчанию она оставляет именованный том нетронутым. Если вы также намерены удалить этот том, сначала еще раз проверьте имена проекта и тома, а затем используйте docker compose down --volumes только тогда, когда будете готовы удалить эти данные. Том с пользовательским именем или внешний (external) том может иметь другое поведение жизненного цикла; сверьтесь с определением в Compose и справочником команд Docker, а не предполагайте, что эта опция затрагивает каждый том.
Рекомендации по восстановлению
Описанный в документации Docker процесс работы с томами восстанавливает tar-архив путем монтирования целевого тома и распаковки архива в него. Для файлов базы данных выполняйте восстановление в новый или предварительно очищенный том при остановленной службе базы данных, соблюдая требования к владельцу файлов и инициализации, указанные в образе базы данных. Не выполняйте распаковку поверх тома, содержащего данные, которые вам все еще нужны: существующие файлы могут конфликтовать с архивом, а распаковка tar не является безопасной стратегией слияния. Если вам нужна точка восстановления с согласованностью на уровне базы данных, используйте собственный процесс резервного копирования и восстановления СУБД в дополнение к архиву исходных файлов или вместо него.
Источники
Определение томов и управление ими в Docker Compose — Docker
docker compose down — Docker
Тома — Docker
Изменение настроек Docker Desktop — Docker