Docker通过-v参数实现容器间数据共享,核心是多个容器挂载同一底层存储(如命名卷shared-data或宿主机绝对路径),数据实时互通且不依赖容器运行状态;推荐使用docker volume create创建命名卷,也可用bind mount快速验证或--volumes-from复用已有容器卷定义。
用 docker run 的 -v 参数实现容器间数据共享,核心在于让多个容器挂载**同一份底层存储**,而不是各自独立的副本。只要挂载目标一致、路径映射正确,数据就能实时互通,且不依赖容器是否同时运行。
用命名卷(named volume)共享最稳妥
命名卷由 Docker 全权管理,路径抽象、权限可控、性能稳定,是官方推荐方式:
- 先创建一个带名字的卷:
docker volume create shared-data - 启动第一个容器,挂载到容器内指定路径,比如
/app/data:docker run -d --name app1 -v shared-data:/app/data nginx - 启动第二个容器,同样挂载同名卷,但可映射到不同路径(如
/shared):docker run -d --name app2 -v shared-data:/shared nginx - 此时
app1写入/app/data/log.txt,app2立即能在/shared/log.txt中读到——无需重启、无延迟
用宿主机目录绑定(bind mount)快速验证
适合开发调试或需直接操作宿主机文件的场景,但路径需绝对且注意权限:
- 在宿主机上建好目录,例如:
mkdir -p /data/shared - 两个容器都挂载该路径:
docker run -d -v /data/shared:/app/data --name svc-a nginx和docker run -d -v /data/shared:/input --name svc-b ubuntu sleep infinity - 任一容器向
/app/data或/input写文件,另一方立刻可见 - 注意:Windows/macOS 用户使用 Docker Desktop 时,宿主机路径需在 Docker 设置中提前共享(如
/Users或C:\Users)
用 --volumes-from 复用已有容器的卷定义
适用于已有容器已声明 Volume,想快速复用其挂载配置(不推荐新项目,但兼容旧部署):
- 起一个“数据容器”(不运行服务,只占位定义卷):
docker create -v /data --name data-container busybox - 其他容器通过
--volumes-from继承:docker run -d --volumes-from data-container --name reader alpine tail -f /dev/null - 再起一个写入容器:
docker run --volumes-from data-container ubuntu sh -c "echo 'done' > /data/status" - 进入
reader容器执行cat /data/status即可看到内容
关键注意事项
共享能跑通 ≠ 安全可用,以下三点必须检查:
-
权限对齐:若容器以非 root 用户(如
www-data)运行,需确保卷内目录归属匹配,可用docker run --user 33:33 -v shared-data:/app/data显式指定,或提前在卷中chown -R 33:33 /var/lib/docker/volumes/shared-data/_data - 并发写入风险:多个容器同时写同一个文件(如日志追加、JSON 更新)易导致内容错乱,应由单一服务负责写,其余只读;高频协同建议改用 Redis、PostgreSQL 等中间件
-
卷生命周期独立:容器删了,命名卷默认保留;如需自动清理,得手动执行
docker volume rm shared-data,或用docker volume prune扫除未被引用的卷











