Docker 数据卷入门:5 分钟搞懂容器数据持久化

举报
yd_257742204 发表于 2026/10/23 19:52:25 2026/10/23
【摘要】 本文介绍 Docker 数据卷的核心概念与三种挂载方式,并通过 MySQL 实例演示数据持久化的常用命令与最佳实践。

Docker 数据卷入门:5 分钟搞懂容器数据持久化

很多初学者第一次使用 Docker 时都会遇到同一个困惑:容器里的文件去哪了?明明昨天还在容器里改过配置文件,今天容器一删一重建,所有修改消失得无影无踪。这篇文章用最短的时间帮你搞清楚容器数据持久化的核心概念——数据卷(Volume)。

一、为什么需要数据卷

Docker 容器的文件系统建立在镜像的只读层之上,运行时通过写时复制(Copy-on-Write)机制在可写层记录修改。问题在于:可写层与容器的生命周期绑定,执行 docker rm 后,可写层连同其中的所有数据一起被删除。对于数据库文件、应用日志、用户上传内容这类需要长期保留的数据,必须把它们放到容器之外。

二、三种挂载方式

Docker 提供三种把宿主机存储挂进容器的方式:

  1. 卷(Volume):由 Docker 统一管理,存储在 /var/lib/docker/volumes/ 目录下,是官方推荐的默认选择。它不依赖宿主机的目录结构,迁移和备份都很方便。
  2. 绑定挂载(Bind Mount):把宿主机上的任意目录直接映射进容器,适合开发场景下的代码热更新,或需要与宿主机共享配置文件的场合。
  3. tmpfs 挂载:数据仅存在于宿主机内存中,容器停止即消失,适合存放临时敏感数据。

三、常用命令实操

创建并查看一个卷:

docker volume create mydata
docker volume inspect mydata

启动容器时挂载(两种等价写法):

docker run -d -v mydata:/var/lib/mysql --name mysql mysql:8.0
docker run -d --mount source=mydata,target=/var/lib/mysql mysql:8.0

以 MySQL 为例,数据目录 /var/lib/mysql 挂到卷 mydata 之后,即使容器被删除重建,重新挂载同一个卷,数据库数据依然完整。备份时只需归档 volume 对应的宿主机目录,或使用 docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czf /backup/mydata.tar.gz /data 一条命令完成。

四、几条实践建议

第一,生产环境的数据库一律使用命名卷而不是匿名卷,匿名卷的名字是随机哈希,日后难以辨认归属。第二,挂载点尽量指向应用的数据目录而非根路径,避免误覆盖容器内的系统文件。第三,注意只读挂载:加 :ro 后缀(如 -v config:/etc/app/config:ro)可以防止容器内进程意外修改宿主机文件。第四,多容器共享同一个卷时要确认应用层面有并发控制,文件系统本身不会替你加锁。

总结

数据卷是容器化路上绕不开的基础设施。记住一个核心原则:镜像负责"程序",卷负责"数据",两者分离,容器才能随意销毁重建。理解了 volume、bind mount、tmpfs 三种方式的适用边界,日常开发和小规模部署中的持久化问题基本都能迎刃而解。

(本文为作者原创技术笔记,欢迎交流指正。)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。