对于 macOS 上的本地 Docker 项目,当您需要在 macOS 和容器中编辑或检查相同的文件时,请使用绑定挂载(bind mount);当容器应当拥有持久化数据(例如数据库或缓存)时,请使用命名卷(named volume)。实际的检验标准是您是否需要在“访达”或 Mac 应用程序中直接访问这些文件。如果是,请绑定特定的项目文件夹。如果不是,请将数据保存在由 Docker 管理的命名卷中。
两种挂载类型之间有什么区别?
绑定挂载将 Mac 上的路径连接到容器内部的路径。两端所做的更改均实时可见,这使其非常适用于源代码、配置文件以及您希望保留在项目文件夹中的生成文件。命名卷由 Docker 存储和管理,并附加到容器中的指定路径。当涉及持久化容器数据以及主机无需直接访问文件时,Docker 推荐使用卷。Docker 的绑定挂载文档和卷文档详细说明了这些差异。
| 您的数据 | 通常选择 | 原因 |
|---|---|---|
| 您在 Mac IDE 中编辑的源文件 | 绑定挂载 | Mac 和容器均可访问项目文件。 |
| 数据库的数据目录 | 命名卷 | Docker 管理持久化的容器数据,无需通过 macOS 共享每个数据库文件。 |
| 您想要用 Mac 工具打开或使用的输出内容 | 绑定挂载 | 输出内容将出现在指定的 Mac 路径中。 |
| 可丢弃的临时状态 | 默认两者皆不选 | 考虑数据是否根本不需要持久化;除非单独删除,否则命名卷在容器删除后仍然存在。 |
为什么 macOS 让这一选择至关重要
Docker Desktop 在 Linux 虚拟机中运行 Linux 容器,因此它需要在 Mac 文件系统与容器之间协调访问。Docker 的设置文档指出,共享主机文件会带来开销;共享过多文件会增加 CPU 负载并减慢文件系统操作。它特别建议,在性能至关重要时,将非代码项(例如缓存和数据库)保存在数据卷中。Docker Desktop 设置
这一指导并不意味着每个绑定挂载都会变慢。它的意思是,数据类型和您的实际工作流程很重要。项目的源代码树自然适合使用绑定挂载,因为在 Mac 上进行编辑就是目的所在。数据库中频繁更改的大量文件通常不需要在“访达”中浏览,因此命名卷是一个更好的起点。对于异常庞大的代码仓库,Docker Desktop 还提供了同步文件共享(Synchronized file shares)功能,作为一项受订阅限制的选项,该选项可以提升绑定挂载的性能;它改变的是文件共享行为,而不是“主机可见的源码”与“Docker 管理的卷”之间的基本区别。同步文件共享
设置项目文件夹和数据库卷
在“终端”中,进入您的项目目录并对代码使用绑定挂载。本例在一个一次性 Alpine 容器的 /workspace 处挂载当前文件夹;您可以根据自己的开发容器替换镜像或命令。
docker run --rm -it \
--mount "type=bind,source=$PWD,target=/workspace" \
alpine:latest sh
在 macOS 默认的 shell 中,$PWD 会展开为当前目录。为完整的挂载参数加上引号,可以在文件夹名称包含空格时确保展开后的主机路径保持完整。Docker 的 --mount 语法非常明确。主机路径必须存在:Docker 文档指出,默认情况下,源路径缺失会导致 --mount 失败。除非标记为只读,否则绑定挂载是可写的,因此容器进程可以更改挂载的 Mac 目录中的文件。当容器只需要读取项目时,请使用 readonly。绑定挂载选项与行为
对于容器所拥有的数据,请改为创建并附加命名卷。以下命令在 PostgreSQL 的标准数据目录挂载一个卷并启动数据库:
docker volume create project-db
docker run --name project-postgres \
--mount type=volume,source=project-db,target=/var/lib/postgresql/data \
-e POSTGRES_PASSWORD='local-dev-only' \
-d postgres:17
这里的 project-db 是持久化卷的名称,POSTGRES_PASSWORD 仅用于本地演示设置,并非生产环境的密码管理模式。删除容器并不会自动删除命名卷。这种持久性有助于容器的替换,但也意味着旧数据可能会留存下来,并且新的运行可能会复用它。请记录下卷名以及重新连接到该卷所需的容器配置。
检查可见性、可移植性和清理
在做出选择之前,请自问:我会使用 Mac 软件打开或编辑这些具体文件吗?如果是,请仅绑定挂载满足任务所需的最窄范围的文件夹,而不是不必要地共享主目录的大范围内容。Docker 指出,macOS 和 Linux 对文件名大小写的处理方式不同,这可能会在容器中暴露出大小写敏感的文件名问题。如果项目在 Linux 中的运行表现异常,请仔细检查名称。Docker Desktop 文件共享说明
如果文件应当保留在容器边界内部,请选择命名卷并使用 Docker 的 volume 命令对其进行管理。该卷不是普通项目位置中的“访达”文件夹;Docker Desktop 将其 Linux 数据存储在其虚拟机环境中。请将卷删除视为数据删除步骤,并单独备份重要的卷内容。Docker 的备份指南指出,容器镜像不包含存储在已挂载卷中的文件系统更改。Docker Desktop 备份与恢复
绑定挂载依赖于主机路径的存在,因此在目录布局不同的各台 Mac 之间可移植性可能较差。命名卷避免了这种项目路径依赖,但其数据仍需要明确的备份或迁移方案。因此,对于许多 Mac 开发项目而言,简单直接的默认做法是:源代码使用绑定挂载,数据库状态使用命名卷,并在项目的 Compose 配置或运行说明中记录每个数据位置。
来源
绑定挂载 — Docker
卷 — Docker
更改您的 Docker Desktop 设置 — Docker
同步文件共享 — Docker
如何备份和恢复您的 Docker Desktop 数据 — Docker