一份数据多个消费者
同一个具名卷可以同时挂载进多个容器,卷里的文件在任一容器内改动,其他容器立刻可见。常见用法是为读取方加只读挂载,让写权限只留在真正需要写的一侧;构建容器产出静态文件、运行容器只读提供访问,就是这个模式最典型的形态。共享卷解决的是数据可见性,并发写的一致性仍要靠应用层协调。
基本信息
| 挂载方式 | 多个容器 -v 同一卷名(或 --mount source=卷名) |
|---|---|
| 写权限控制 | 读取方加 :ro 只读挂载 |
| 可见性 | 任一容器内的改动其他容器立即读到 |
| 注意 | 并发写入需应用层协调,数据库文件不适合多进程共享 |
典型使用场景
- 构建与运行分离:构建容器写入产物,运行容器只读挂载提供访问
- 主容器加辅助容器:日志或数据目录共享给采集、备份容器
- 多副本共享静态资源:多个副本只读挂载同一份前端产物
- 批量任务协作:一个容器生成数据,另一个容器消费或归档
- 本地开发联动:宿主机编辑、容器内运行,中间用卷做缓冲
共享卷配置
共享卷配置
# 构建容器把产物写进共享卷
docker run --rm -v shared:/out app/builder:1.0
# 运行容器只读挂载同一卷提供访问
docker run -d --name web -v shared:/usr/share/nginx/html:ro nginx:1.27-alpine
# 临时容器验证共享卷内容
docker run --rm -v shared:/out alpine ls -l /out
# 查看卷被哪些容器使用
docker ps -a --filter volume=shared --format '{{.Names}}\t{{.Status}}'常见组合与挂载方式
| 组合 | 角色分工 | 挂载建议 |
|---|---|---|
| 构建 + 运行 | 一方写产物,一方对外提供 | 写方读写,读方 :ro |
| 主容器 + 辅助容器 | 共享数据目录 | 双方按需读写,路径要约定一致 |
| 多副本 + 静态资源 | 多副本只读同一份内容 | 全部 :ro,避免相互改写 |
| 批处理 + 归档 | 一方产出,一方备份 | 写方读写,备份方只读 |
共享卷的挂载路径在各容器里可以不同,但卷是同一个;读侧加 :ro 能防止运行角色误改数据。
多个容器写同一份文件时没有跨容器的文件锁协调,顺序与完整性由应用负责,别把强一致的数据交给共享卷处理。