容器重启数据就没了?Docker volume 挂载一次讲清

举报
yd_252454439 发表于 2026/11/11 08:11:15 2026/11/11
【摘要】 刚用 Docker 的人几乎都踩过这个坑:容器里跑着数据库,改了几条数据,容器一重启,全没了。不是数据库坏了,是数据本来就写在容器自己的那层里——容器删了、重建了,数据跟着走。解决办法只有一个:把数据写到容器外面去,用的就是 volume 挂载。先分清三个概念。第一是匿名卷:`docker run -v /data` 这样写,Docker 会自动建一个卷挂到 /data,数据能活过容器重启,...

刚用 Docker 的人几乎都踩过这个坑:容器里跑着数据库,改了几条数据,容器一重启,全没了。不是数据库坏了,是数据本来就写在容器自己的那层里——容器删了、重建了,数据跟着走。解决办法只有一个:把数据写到容器外面去,用的就是 volume 挂载。

先分清三个概念。第一是匿名卷:`docker run -v /data` 这样写,Docker 会自动建一个卷挂到 /data,数据能活过容器重启,但卷名是一串随机 ID,容器删了以后很难找回,一般不推荐。第二是具名卷:`docker run -v mydata:/data`,卷有个名字 mydata,用 `docker volume ls` 能看见,用 `docker volume inspect mydata` 能查到它在宿主机上的真实路径,备份、迁移都方便,这是最常用的做法。第三是绑定挂载:`docker run -v /home/user/app:/app`,直接把宿主机上的一个目录映射进容器,改代码、改配置立刻生效,开发调试时最顺手。

新手最容易混淆的是具名卷和绑定挂载。记住一条:冒号前面是名字就是卷,冒号前面是斜杠开头的路径就是绑定挂载。卷由 Docker 管理,存在 Docker 自己的数据目录里;绑定挂载就是你指定的那个目录,删目录数据就没,权限问题也由你负责。

再说两个实操要点。一是权限:绑定挂载时容器里的用户和宿主机用户 UID 不一致,经常出现容器写不进目录、或者写出来的文件宿主机改不了,表现就是 permission denied。解决办法是让容器用宿主机用户的 UID 跑,或者把目录权限放宽到该用户可写,不要图省事直接 chmod 777。二是备份:具名卷备份很简单,起一个临时容器把卷挂上再挂一个宿主机目录,用 tar 打包就行,例如 `docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czf /backup/mydata.tar.gz -C /data .`,恢复时反向解包。

最后给一个检查清单:跑有状态服务(数据库、上传文件、缓存)之前,先问自己三个问题:数据写在哪个目录?这个目录挂卷了吗?卷名或路径我记下来了吗?三个答案都有,容器随便重启、重建都不怕。Docker 的口号是“一次构建、处处运行”,但数据持久化这一步,它不会替你自动做——挂载是你亲手给数据安的家。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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