R / Richie全部文章 ↑

Linux · 2 分钟阅读

13. 数据管理

容器本身是临时的,可写层随容器销毁。数据要持久化请挂载卷,别写进容器。

三种方式

方式 谁管 跨主机 性能 适合
Volume Docker 需 driver 高 数据库、长期数据
Bind Mount 用户 否 看底层 FS 配置文件、开发期
tmpfs 内存 否 最高 临时缓存、敏感数据

2026 年生产首选 named volume + 备份策略,bind mount 仅限 dev/配置场景。

Volume

docker volume create my-vol
docker volume ls
docker volume inspect my-vol

# 删除
docker volume rm my-vol
docker volume prune            # 清无用

挂载

# --mount(推荐,语义清晰)
docker run -d -P --name web \
    --mount source=my-vol,target=/webapp \
    training/webapp python app.py

# -v(兼容老写法)
docker run -d -P --name web \
    -v my-vol:/webapp \
    training/webapp python app.py

# 只读
docker run -d -P --name web \
    --mount source=my-vol,target=/webapp,readonly \
    training/webapp python app.py

挂载点里若已有数据,原数据会被隐藏。容器内同路径文件 = mount 内容。

备份 / 恢复

# 备份(不依赖容器运行)
docker run --rm \
    -v my-vol:/data:ro \
    -v $(pwd):/backup \
    alpine tar czf /backup/my-vol-$(date +%F).tgz -C /data .

# 恢复
docker run --rm \
    -v my-vol:/data \
    -v $(pwd):/backup \
    alpine tar xzf /backup/my-vol-2026-08-04.tgz -C /data

Bind Mount

docker run -d -P --name web \
    --mount type=bind,source=/srv/webapp,target=/opt/webapp \
    training/webapp python app.py

# 只读
docker run -d -P --name web \
    --mount type=bind,source=/srv/webapp,target=/opt/webapp,readonly \
    training/webapp python app.py

Bind mount 风险:容器能改主机文件。生产要尽量避免,开发机用着方便。

tmpfs

docker run -d --tmpfs /tmp training/webapp
# 或
docker run -d --mount type=tmpfs,target=/tmp training/webapp

一些经验

  • 数据库不要 bind mount,文件系统权限/IO 行为容易踩坑
  • 备份时容器能停则停,运行时冷备要走数据库自身的备份工具
  • 多容器共享一份配置用 volume;多容器共享同一份数据要看具体语义
  • docker system df 看卷占用

参考