【AI 总结】Docker Bind mounts

Bind mounts | AI 总结

Bind mounts 核心定义

  • 本质将主机机器上的文件或目录直接挂载到容器内的指定路径,与 Docker 卷(Volume)不同 —— 卷是在 Docker 主机存储目录内新建目录并由 Docker 管理,而绑定挂载依赖主机已有的文件 / 目录结构。
  • 核心作用:建立主机与容器的文件双向交互通道,支持开发、配置共享、数据持久化等场景。

适用场景

  1. 开发环境文件共享:将主机的源代码或构建产物(如 source/target 目录)挂载到容器,实现代码修改后容器内实时生效,无需重新构建镜像。
  2. 配置文件传递:将主机的配置文件(如 /etc/resolv.conf)挂载到容器,为容器提供 DNS 解析等基础配置(Docker 默认采用此方式)。
  3. 容器数据持久化:让容器生成的文件(如日志、输出文件)直接保存到主机文件系统,避免容器删除后数据丢失。
  4. 构建过程辅助:在 Docker 构建阶段,将主机源代码挂载到构建容器,用于代码测试、 lint 检查或编译。

关键特性与约束

数据覆盖规则

若将主机文件 / 目录挂载到容器内非空目录,容器该目录下的原有文件会被挂载内容 “覆盖”(类似 Linux 主机挂载 USB 驱动器到 /mnt 后,/mnt 原有内容被隐藏),且无法通过 “卸载” 恢复,需重建容器取消挂载。

安全与访问约束

  1. 默认权限:绑定挂载默认允许容器对主机文件 / 目录拥有写权限,容器内进程可修改、删除主机文件,存在安全风险(如误删系统文件),需通过 readonly/ro 选项限制为只读。
  2. 跨主机限制:绑定挂载基于 Docker 守护进程所在主机,若使用远程守护进程,无法挂载客户端机器的文件 / 目录;Docker Desktop 因守护进程运行在 Linux 虚拟机内,通过内置机制自动处理原生主机路径的挂载映射。
  3. 主机依赖性:容器依赖主机特定的目录结构,若在其他主机运行,缺少对应路径会导致容器启动失败。

语法与配置选项

两种核心命令格式

命令类型 语法格式 关键差异
--mount(推荐) docker run --mount type=bind,src=<主机路径>,dst=<容器路径>[,<选项>] 选项更明确,支持所有配置参数,不自动创建主机不存在的路径(路径不存在时报错)
--volume-v docker run -v <主机路径>:<容器路径>[:选项] 简洁但选项隐藏,自动创建主机不存在的路径(且默认创建为目录)

主要配置选项

1. --mount 选项(键值对形式)

选项键(别名) 说明
sourcesrc 主机文件 / 目录路径,支持绝对路径和相对路径
destinationdst/target 容器内挂载路径,必须为绝对路径
readonlyro 挂载为只读,禁止容器修改主机文件
bind-propagation 配置绑定传播(仅 Linux 主机支持),如 rshared/rslave
bind-recursive 控制子挂载是否包含(仅 --mount 支持),如 enabled(默认,包含子挂载)、disabled(忽略子挂载)

2. --volume 选项(冒号分隔字段)

  • 格式:-v <主机路径>:<容器路径>:<逗号分隔选项>
  • 常用选项:
    • ro:只读挂载;
    • z/Z:SELinux 标签配置(z 表示多容器共享,Z 表示私有);
    • 绑定传播选项:rprivate(默认)、sharedrslave 等。

实操示例

基础挂载:主机 target 目录挂载到容器 /app

  1. --mount 方式:
    1
    docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app nginx:latest
  2. --volume 方式:
    1
    docker run -d -it --name devtest -v "$(pwd)"/target:/app nginx:latest
  • 验证:通过 docker inspect devtest 查看 Mounts 字段,确认 TypebindRWtrue(默认可写)。

只读挂载

1
2
3
4
# --mount 方式
docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app,readonly nginx:latest
# --volume 方式
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 等系统目录,可能导致主机瘫痪)。

【AI 总结】Docker Bind mounts
https://blog.lllllan.cn/docker/storage/bind-mounts/
作者
lllllan
发布于
2026年1月11日
许可协议