github编辑

8.2 挂载主机目录

8.2.1 什么是绑定挂载

Bind Mount (绑定挂载) 将 宿主机的目录或文件 直接挂载到容器中。容器可以读写宿主机的文件系统。

spinner

目录结构(同一份文件):

/home/user/code/ (或 /usr/share/nginx/html/)
├── index.html
├── style.css
└── app.js

8.2.2 Bind Mount vs Volume

特性
Bind Mount
Volume

数据位置

宿主机任意路径

Docker 管理的目录

路径指定

必须是绝对路径

卷名

可移植性

依赖宿主机路径

更好 (Docker 管理)

性能

依赖宿主机文件系统

优化的存储驱动

适用场景

开发环境、配置文件

生产数据持久化

备份

直接访问文件

需要通过 Docker

选择建议

需求
推荐方案

开发时同步代码

Bind Mount

持久化数据库数据

Volume

共享配置文件

Bind Mount

容器间共享数据

Volume

备份方便

Bind Mount (直接访问)

生产环境

Volume


8.2.3 基本语法

使用 --mount (推荐)

使用 -v (简写)

两种语法对比

特性
--mount
-v

语法

键值对,更清晰

冒号分隔,更简洁

路径不存在时

直接报错 (Fail Fast)

静默自动创建 目录

推荐程度

✅ 推荐

常用

⚠️ 陷阱:如果不小心挂载了一个不存在的宿主机路径,使用 -v 会在宿主机上静默创建一个 空目录(即使你本来想挂载的是一个文件),这常常会导致权限错误或应用无法正常读取。这也正是为什么 Docker 官方更推荐使用 --mount 的原因:它会遵循“Fail Fast”原则直接报错,避免弄巧成拙。


8.2.4 使用场景

场景一:开发环境代码同步

场景二:配置文件挂载

场景三:日志收集

场景四:共享 SSH 密钥


8.2.5 只读挂载

防止容器修改宿主机文件:

容器内尝试写入会报错:


8.2.6 挂载单个文件

⚠️ 注意:挂载单个文件时,如果宿主机上的文件被编辑器替换 (而非原地修改),容器内仍是旧文件的 inode。建议重启容器或挂载目录。


8.2.7 查看挂载信息

输出:

字段
说明

Type

挂载类型 (bind)

Source

宿主机路径

Destination

容器内路径

RW

是否可读写

Propagation

挂载传播模式


8.2.8 常见问题

Q:路径不存在报错

解决:确保源路径存在,或改用 -v (会自动创建)

Q:权限问题

容器内用户可能无权访问挂载的文件:

Q:macOS/Windows 性能问题

在 Docker Desktop 上,Bind Mount 性能较差 (需要跨文件系统同步):

选项
说明

:cached

宿主机权威,容器读取可能延迟

:delegated

容器权威,宿主机读取可能延迟

:consistent

默认,完全一致 (最慢)


8.2.9 最佳实践

1. 开发环境使用 Bind Mount

2. 生产环境使用 Volume

3. 配置文件使用只读挂载

4. 注意路径安全


最后更新于