在运行 Docker Desktop 的 Mac 上,通过将 Compose 命名卷挂载到临时容器中并将 tar 归档写入 Mac 上的文件夹来进行备份。在删除容器之前,请检查卷名、停止写入该卷的服务、创建归档并确认文件存在。常规的 docker compose down 会保留命名卷;docker compose down --volumes 则会删除符合条件的项目卷,因此在备份完成之前切勿运行它。
1. 确定 Compose 卷及其挂载路径
在终端中,进入包含项目 Compose 文件的目录。找到服务挂载(例如 db-data:/var/lib/postgresql/data)及其在 volumes: 下匹配的顶级声明。冒号左侧的 db-data 是 Compose 键;冒号后面的容器路径是应用程序访问数据的位置。Compose 可能会使用项目前缀来创建实际的 Docker 卷,而配置的 name: 则可以为其指定自定义名称。Docker 的 Compose 卷参考文档描述了这些命名规则。
列出当前 Compose 项目使用的卷:
docker compose volumes
利用该输出和 Compose 文件来确定确切的 Docker 卷。如果项目使用了多个 Compose 文件、配置文件(profile)或自定义项目名称,请在检查时使用与启动技术栈时相同的选项。不要仅凭 YAML 键来推测实际的卷名。docker volume ls 可以显示所有 Docker 卷,但它可能包含无关的项目。
2. 在创建归档前停止写入
如果在复制文件时数据库正在发生更改,文件系统归档并不一定能保证数据库备份的一致性。首先干净地停止应用程序;对于 Compose 技术栈,docker compose stop 会停止其服务,同时保留容器和卷。如果数据库具有特定于应用程序的转储(dump)或备份程序,且事务级一致性至关重要时,请使用该程序;如果您需要文件级副本,也可以在此基础上制作卷归档。
在此阶段避免运行 docker compose down --volumes。Compose 文档指出,down 默认会删除项目的容器和网络,而 --volumes 还会删除符合条件的命名卷和匿名卷。外部卷(external volumes)不会被 down 删除。Docker 的 compose down 参考文档解释了这一区别。
3. 在 Mac 文件夹中创建 tar 备份
以下示例假设实际的 Docker 卷名为 myproject_db-data。请将该值替换为您确认的具体名称。它会在当前 Mac 目录下保存 db-data-backup.tar。Docker Desktop 在 Linux 虚拟机内部运行 Docker 引擎,因此命名卷的数据由 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 mount)。如果挂载失败,请检查 Docker Desktop 对该文件夹的文件共享访问权限。
检查归档是否存在且大小是否合理(非零):
ls -lh "$backup_file"
这仅能确认文件已创建,并不能保证其内容构成了可恢复的应用程序备份。请将归档保存在 Docker 管理的卷之外的某个位置,并考虑在删除数据之前将其复制到常规备份目标位置。
4. 仅在验证目标后才删除容器
归档就绪后,使用以下命令删除项目的容器:
docker compose down
默认情况下,这会保留命名卷。如果您的目的也是删除该卷,请先再次核对项目和卷名,然后仅在准备好删除该数据时才使用 docker compose down --volumes。自定义命名卷或外部卷可能具有不同的生命周期行为;请查阅 Compose 定义和 Docker 的命令参考,而不是想当然地认为该选项会影响每个卷。
恢复注意事项
Docker 文档中记录的卷工作流程通过挂载目标卷并将归档解压到其中来恢复 tar 归档。对于数据库文件,请在数据库服务停止的状态下将其恢复到全新的或有意清空的卷中,并遵循数据库镜像的所有权和初始化要求。切勿覆盖解压到仍包含所需数据的卷上:现有文件可能会与归档发生冲突,并且 tar 解压并不是一种安全的合并策略。如果您需要具备数据库一致性的恢复点,除了使用原始文件归档之外(或代替原始文件归档),还请使用数据库自身的备份与恢复流程。
来源
在 Docker Compose 中定义和管理卷 — Docker
docker compose down — Docker
卷 — Docker
更改您的 Docker Desktop 设置 — Docker