-v 挂载是什么
挂载选项把宿主机的目录或数据卷接到容器内的路径上,写法是源、目标与权限选项三段。源写成名称时使用由 Docker 管理的卷,写成路径时是绑定挂载,直接映射宿主目录。它是容器数据能不能留下来的关键:没挂出来的数据都躺在可写层里,容器一删就没了。
基本信息
| 语法 | -v 源:目标路径[:权限选项] |
|---|---|
| 权限选项 | ro 只读,rw 可读写(默认) |
| 省略源 | 只写容器内路径时自动创建匿名卷 |
| 卷与绑定的区分 | 源不是绝对路径即为卷,是绝对路径即为宿主目录绑定 |
| 适用平台 | Linux 与 macOS 常规使用;Windows 路径含冒号,建议改用 --mount 写法 |
典型使用场景
- 数据库持久化:把数据目录挂到卷上,容器重建后数据仍在
- 配置注入:把宿主上的配置文件挂进容器,改动后重启即生效
- 静态资源目录:把前端产物目录只读挂给 Web 服务,避免容器内被改写
- 开发调试:把源码目录挂进容器,改代码立即生效,省去反复构建镜像
- 临时目录隔离:需要落盘的临时数据挂到独立目录,便于清理与容量控制
常用示例
常用示例
docker run -d -v pgdata:/var/lib/postgresql/data --name db postgres:16-alpine # 卷持久化
docker run -d -v /srv/www:/usr/share/nginx/html:ro --name web nginx:1.27-alpine # 只读映射
docker run --rm -v $PWD/config.yml:/etc/app/config.yml:ro app/web:1.0 # 单文件只读挂载
docker run --rm -v $PWD:/work -w /work golang:1.23 go test ./... # 开发时挂源码
ls -ld /srv/www # 确认宿主目录属主与权限卷与绑定挂载对照
| 对比项 | 数据卷 | 宿主目录绑定 |
|---|---|---|
| 源写法 | 名称,例如数据库数据卷 | 绝对路径,例如主机上的站点目录 |
| 管理者 | 由容器引擎管理,位置固定在数据根目录下 | 完全由使用者维护 |
| 典型用途 | 数据库、消息队列等有状态服务的数据 | 配置文件、源码目录、静态资源 |
| 备份方式 | 通过卷导出或容器内归档 | 直接在宿主目录上备份 |
| 可移植性 | 随编排文件一起迁移更方便 | 依赖宿主目录结构与权限 |
挂载之后要验证的事
- 确认容器内看到的内容与宿主一致,避免挂到了空目录却以为配置生效
- 核对属主与权限:容器内进程用户能否读写,只读挂载是否挡住了必要的写入
- 检查是否随容器自启生效,编排文件里的挂载与手写命令要一致
- 确认数据真的落在挂载目录里,可写层里的数据删容器即丢失
- 规划容量:数据目录所在分区要留足空间,写满会同时影响容器与宿主
宿主路径不存在时会被自动创建成目录。本意是挂单个文件时尤其容易踩坑:容器里出现一个同名目录,服务读配置直接报错。
同一份挂载配置在编排文件、部署脚本与手工命令里容易不一致,变更时三处都要核对,否则会出现「改了没生效」的错觉。
取舍建议
- 有状态服务优先用卷:位置由引擎统一管理,迁移与备份更规整
- 需要人工编辑的配置用宿主目录绑定,改完重启容器即可生效
- 线上服务尽量用只读挂载,减少容器内被篡改的可能
- 挂载路径按服务划分目录,避免多个容器写同一个位置互相覆盖
- 关键数据目录单独分区并做容量监控,写满会同时影响容器与宿主