Bind mounts 核心定义
- 本质:将主机机器上的文件或目录直接挂载到容器内的指定路径,与 Docker 卷(Volume)不同 —— 卷是在 Docker 主机存储目录内新建目录并由 Docker 管理,而绑定挂载依赖主机已有的文件 / 目录结构。
- 核心作用:建立主机与容器的文件双向交互通道,支持开发、配置共享、数据持久化等场景。
适用场景
- 开发环境文件共享:将主机的源代码或构建产物(如
source/target 目录)挂载到容器,实现代码修改后容器内实时生效,无需重新构建镜像。
- 配置文件传递:将主机的配置文件(如
/etc/resolv.conf)挂载到容器,为容器提供 DNS 解析等基础配置(Docker 默认采用此方式)。
- 容器数据持久化:让容器生成的文件(如日志、输出文件)直接保存到主机文件系统,避免容器删除后数据丢失。
- 构建过程辅助:在 Docker 构建阶段,将主机源代码挂载到构建容器,用于代码测试、 lint 检查或编译。
关键特性与约束
数据覆盖规则
若将主机文件 / 目录挂载到容器内非空目录,容器该目录下的原有文件会被挂载内容 “覆盖”(类似 Linux 主机挂载 USB 驱动器到 /mnt 后,/mnt 原有内容被隐藏),且无法通过 “卸载” 恢复,需重建容器取消挂载。
安全与访问约束
- 默认权限:绑定挂载默认允许容器对主机文件 / 目录拥有写权限,容器内进程可修改、删除主机文件,存在安全风险(如误删系统文件),需通过
readonly/ro 选项限制为只读。
- 跨主机限制:绑定挂载基于 Docker 守护进程所在主机,若使用远程守护进程,无法挂载客户端机器的文件 / 目录;Docker Desktop 因守护进程运行在 Linux 虚拟机内,通过内置机制自动处理原生主机路径的挂载映射。
- 主机依赖性:容器依赖主机特定的目录结构,若在其他主机运行,缺少对应路径会导致容器启动失败。
语法与配置选项
两种核心命令格式
| 命令类型 |
语法格式 |
关键差异 |
--mount(推荐) |
docker run --mount type=bind,src=<主机路径>,dst=<容器路径>[,<选项>] |
选项更明确,支持所有配置参数,不自动创建主机不存在的路径(路径不存在时报错) |
--volume(-v) |
docker run -v <主机路径>:<容器路径>[:选项] |
简洁但选项隐藏,自动创建主机不存在的路径(且默认创建为目录) |
主要配置选项
1. --mount 选项(键值对形式)
| 选项键(别名) |
说明 |
source(src) |
主机文件 / 目录路径,支持绝对路径和相对路径 |
destination(dst/target) |
容器内挂载路径,必须为绝对路径 |
readonly(ro) |
挂载为只读,禁止容器修改主机文件 |
bind-propagation |
配置绑定传播(仅 Linux 主机支持),如 rshared/rslave |
bind-recursive |
控制子挂载是否包含(仅 --mount 支持),如 enabled(默认,包含子挂载)、disabled(忽略子挂载) |
2. --volume 选项(冒号分隔字段)
- 格式:
-v <主机路径>:<容器路径>:<逗号分隔选项>
- 常用选项:
ro:只读挂载;
z/Z:SELinux 标签配置(z 表示多容器共享,Z 表示私有);
- 绑定传播选项:
rprivate(默认)、shared、rslave 等。
实操示例
基础挂载:主机 target 目录挂载到容器 /app
--mount 方式:1
| docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app nginx:latest
|
--volume 方式:1
| docker run -d -it --name devtest -v "$(pwd)"/target:/app nginx:latest
|
- 验证:通过
docker inspect devtest 查看 Mounts 字段,确认 Type 为 bind、RW 为 true(默认可写)。
只读挂载
1 2 3 4
| docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app,readonly nginx:latest
docker run -d -it --name devtest -v "$(pwd)"/target:/app:ro nginx:latest
|
Docker Compose 配置绑定挂载
1 2 3 4 5 6 7 8 9
| services: frontend: image: node:lts volumes: - type: bind source: ./static target: /opt/app/static volumes: myapp:
|
高级配置
绑定传播(仅 Linux 主机)
- 定义:控制挂载目录的子挂载是否在 “原挂载” 与 “副本挂载” 间同步(如主机
/tmp 挂载到容器 /usr 和 /app,子挂载 /tmp/a 是否同步到容器两个路径)。
- 常用配置:
rprivate(默认):无双向传播;
rslave:单向传播(原挂载子挂载同步到副本,反之不同步);
rshared:双向传播。
SELinux 标签配置
- 仅支持
--volume 命令,需谨慎使用(可能影响主机文件权限):
z:多容器共享挂载内容,如 -v "$(pwd)"/target:/app:z;
Z:挂载内容私有,如 -v "$(pwd)"/target:/app:Z(禁止用于 /home//usr 等系统目录,可能导致主机瘫痪)。