bind mount 是什么
bind mount 把宿主机的目录或文件直接挂进容器,容器内看到的就是宿主机上的同一份数据:改配置、换代码立即生效,不需要重建镜像。代价是宿主机的特性会一并进入容器——uid 与 gid 权限判断、SELinux 标签、文件路径差异都会影响结果,跨机器迁移也不如数据卷方便。
基本信息
| 写法 | -v /宿主路径:/容器路径[:ro],ro 表示容器内只读 |
|---|---|
| 自动创建 | 宿主路径不存在时按目录自动创建,容易埋坑 |
| 权限判定 | 按宿主机 uid/gid 判定,容器内用户可能无写权限 |
| SELinux | RHEL 系需加 :z 或 :Z 重打标签,否则容器内拒绝访问 |
| 适用 | 源码目录、nginx 配置、证书、日志落盘 |
典型使用场景
- 本地开发:把源码目录挂进容器,改完代码重启进程即可生效
- 配置注入:挂载 nginx.conf 或 application.yml,改配置不用重建镜像
- 证书挂载:把宿主上的证书目录以只读方式挂入,便于统一轮转
- 日志落盘:容器日志直接写到宿主目录,方便采集与留存
- 静态站点:把宿主 web 根目录挂进 nginx 容器,发布只需更新宿主文件
常用形态
常用形态
docker run -d --name web \
-v /data/www:/usr/share/nginx/html:ro \
-v /data/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
nginx:1.27 # 配置与静态资源都以只读方式挂入
docker exec web cat /etc/nginx/nginx.conf # 确认容器内看到的是宿主文件
ls -lZ /data/www # RHEL 系检查 SELinux 标签是否匹配bind mount 与数据卷对比
| 维度 | bind mount | 数据卷 volume |
|---|---|---|
| 位置 | 宿主任意路径 | 由 Docker 管理,默认在 /var/lib/docker/volumes |
| 宿主依赖 | 强依赖宿主目录结构 | 与宿主解耦,跨机器迁移更顺 |
| 权限问题 | 需处理 uid/gid 与 SELinux | 由 Docker 管理,问题少 |
| 适合数据 | 配置、源码、日志 | 数据库、上传文件等持久数据 |
| 备份方式 | 直接打包宿主目录 | 走 docker volume 或备份容器 |
Docker Desktop 在 Windows 与 macOS 上的 bind 挂载要经过共享层,大量小文件读写明显慢于 Linux 原生环境;生产数据请使用数据卷。
挂载单个文件时,宿主机上源文件必须提前存在:不存在时 Docker 会创建一个同名目录挂进去,容器内读到的就是目录而非文件,报错信息往往令人困惑。