首页/云/云与容器速查/bind mount 宿主机目录挂载
容器与 Docker106 条

bind mount 宿主机目录挂载

把宿主任意目录挂进容器:改配置、换代码立即生效,适合开发与配置注入;代价是权限、SELinux、路径差异等宿主特性会直接进入容器。

云与容器速查云更新于 2026-10-13

bind mount 是什么

bind mount 把宿主机的目录或文件直接挂进容器,容器内看到的就是宿主机上的同一份数据:改配置、换代码立即生效,不需要重建镜像。代价是宿主机的特性会一并进入容器——uid 与 gid 权限判断、SELinux 标签、文件路径差异都会影响结果,跨机器迁移也不如数据卷方便。

基本信息

写法-v /宿主路径:/容器路径[:ro],ro 表示容器内只读
自动创建宿主路径不存在时按目录自动创建,容易埋坑
权限判定按宿主机 uid/gid 判定,容器内用户可能无写权限
SELinuxRHEL 系需加 :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 会创建一个同名目录挂进去,容器内读到的就是目录而非文件,报错信息往往令人困惑。

易错点

  • 挂单个文件前源文件不存在,Docker 建了同名目录挂进去,配置读取失败还难排查
  • SELinux 机器不加 :z,容器内 Permission denied,改 chmod 也没用
  • 容器内应用以非 root 运行,宿主目录权限不匹配导致写日志失败
  • 把生产数据库数据放 bind mount,迁移换机时路径与权限问题集中爆发

数据来源与参考

  • Docker Docs:Bind mounts

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌