要在 macOS 上恢复 Docker Compose 具名卷,请停止向其写入数据的服务,确认确切的 Docker 卷名称,并通过一个临时容器将备份归档解压到该卷中。Docker Desktop 将 Linux 卷保存在其 Linux 虚拟机内部,因此请使用 Docker CLI 来访问它们,而不要尝试在访达(Finder)中直接编辑 Docker 的内部文件。Docker 卷指南介绍了基于容器的恢复方法,而 Docker Desktop 网络概述描述了 Mac 上使用的 Linux 虚拟机。
恢复之前:检查归档文件和 Compose 项目
确保 Docker Desktop 正在运行,然后打开终端并切换到包含 Compose 文件的目录。在访达中找到归档文件,或在终端中确认其名称。以下示例假设其在名为 backup-files 的文件夹中,文件名为 backup.tar;请根据实际文件调整这些值。
在解压之前检查归档文件的内容。这有助于你确定文件是直接存储在归档根目录下,还是位于诸如 data/ 之类的父目录下。
tar -tf "$HOME/backup-files/backup.tar" | head -30
head 命令将输出限制为前 30 个路径;它不会修改归档文件。注意路径是否以前缀目录开头。你需要将正确的层级解压到应用程序的数据目录中。Docker 官方文档中的示例使用了 --strip 1,因为其归档文件包含一个顶级目录;如果你的归档没有此前缀,请勿盲目使用该选项。Docker 的恢复示例展示了解压路径如何影响恢复后的目录结构。
确认确切的卷名称
Compose 卷键(例如 db-data)可能并不是 Docker 卷的全名。Compose 通常会为其加上项目名称作为前缀,但使用 name: 或 external: true 配置的卷可能会使用其他名称。Compose 卷参考文档对这些命名选项进行了解释。
列出卷并查看 Compose 配置,以确定你的服务使用的是哪一个:
docker volume ls
docker compose config
在解析后的 Compose 配置中,找到服务的数据卷映射以及解析出的卷名称。如果需要检查候选卷,请运行 docker volume inspect VOLUME_NAME(将 VOLUME_NAME 替换为实际名称)。在继续之前,请确认它属于预期的项目和服务;恢复到错误的卷中可能会覆盖无关数据。
停止写入服务并恢复备份
在恢复之前停止 Compose 服务,以免应用程序在解压过程中修改文件。运行 docker compose down 会停止并移除项目的容器和网络;默认情况下,它会保留具名卷。避免添加 -v 或 --volumes,因为这会删除 Compose 管理的具名卷。Docker 的 compose down 参考文档中列出了此行为。
docker compose down
设置一个 shell 变量为你确认的确切卷名,然后使用临时容器解压归档文件。本示例使用官方的 alpine 镜像,以只读方式挂载备份文件夹,并将目标卷挂载到 /restore。如果你的实际名称不同,请替换 myproject_db-data。该镜像必须在本地可用,或者 Docker 能够拉取它。
VOLUME_NAME='myproject_db-data'
BACKUP_DIR="$HOME/backup-files"
docker run --rm \
--mount "type=volume,source=$VOLUME_NAME,target=/restore" \
--mount "type=bind,source=$BACKUP_DIR,target=/backup,readonly" \
alpine sh -c 'cd /restore && tar -xf /backup/backup.tar --strip-components=1'
该命令假定归档文件包含一层外包目录,例如 data/file.db。如果归档文件列表显示文件直接位于其根目录下,请移除 --strip-components=1。如果路径具有不同的通用前缀,请选择要去除的层级数,以使应用程序所需的文件直接位于 /restore 下。--mount 语法明确挂载了具名卷和主机目录;Docker 在其卷指南中记录了这些挂载选项和恢复模式。
解压会替换具有匹配路径的文件,但不会清除卷中已存在的无关文件。如果你需要与备份完全一致的镜像,合并式的解压方式是不够的:首先为当前卷单独创建一个备份,然后在确认归档和目标无误后执行有针对性的清理程序。切勿对尚未确认的卷执行宽泛的删除命令。
启动项目并检查结果
再次启动 Compose 服务:
docker compose up -d
Compose 会重用项目中声明的现有卷,若缺失则会创建新卷。Compose 卷参考文档记录了此行为。检查服务日志,并在适用情况下使用应用程序自身的完整性或数据库恢复检查。在将恢复视为完成之前,请确认所需记录或文件确实存在。
如果服务报告数据目录为空,请重新检查卷名称、主机目录路径和归档的目录结构。此外,请验证归档是否与应用程序版本兼容,以及备份是否是在应用程序能够恢复的状态下进行的。成功的 tar 解压仅确认了文件已解包;它并不能证明应用程序数据是有效的。
来源
卷 (Volumes) — Docker
在 Docker Compose 中定义和管理卷 — Docker
docker compose down — Docker
Docker Desktop 上的网络 — Docker