对于 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 配置或运行说明中记录每个数据位置。

来源