Docker 数据卷入门:5 分钟搞懂容器数据持久化
Docker 数据卷入门:5 分钟搞懂容器数据持久化
很多初学者第一次使用 Docker 时都会遇到同一个困惑:容器里的文件去哪了?明明昨天还在容器里改过配置文件,今天容器一删一重建,所有修改消失得无影无踪。这篇文章用最短的时间帮你搞清楚容器数据持久化的核心概念——数据卷(Volume)。
一、为什么需要数据卷
Docker 容器的文件系统建立在镜像的只读层之上,运行时通过写时复制(Copy-on-Write)机制在可写层记录修改。问题在于:可写层与容器的生命周期绑定,执行 docker rm 后,可写层连同其中的所有数据一起被删除。对于数据库文件、应用日志、用户上传内容这类需要长期保留的数据,必须把它们放到容器之外。
二、三种挂载方式
Docker 提供三种把宿主机存储挂进容器的方式:
- 卷(Volume):由 Docker 统一管理,存储在 /var/lib/docker/volumes/ 目录下,是官方推荐的默认选择。它不依赖宿主机的目录结构,迁移和备份都很方便。
- 绑定挂载(Bind Mount):把宿主机上的任意目录直接映射进容器,适合开发场景下的代码热更新,或需要与宿主机共享配置文件的场合。
- 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 三种方式的适用边界,日常开发和小规模部署中的持久化问题基本都能迎刃而解。
(本文为作者原创技术笔记,欢迎交流指正。)
- 点赞
- 收藏
- 关注作者
评论(0)