Docker 数据卷入门:-v 挂载的三种写法与选坑指南
从一个经典事故说起
容器一删,数据全没——这是每个 Docker 新手几乎必踩的坑。容器里的文件系统虽然可写,但它是“临时的”:docker rm 之后,你在容器里写过的配置、上传的文件、积累的数据库,都会跟着容器一起消失。想让数据活得比容器久,就要用数据卷(Volume)和挂载。
-v 的三种写法
第一种:匿名卷。docker run 里只写容器内路径,比如 -v /var/lib/mysql。Docker 会在宿主机 /var/lib/docker/volumes 下自动生成一个随机名字的目录替你保管数据。好处是省事,坏处是名字难认、批量清理时容易误删,不适合需要长期管理的数据。
第二种:命名卷。写法是 -v mydata:/var/lib/mysql,冒号前面是自己起的名字。名字固定、便于备份和跨容器复用,是生产环境管理数据库数据常见的选择。注意一个易错点:宿主机卷为空时首次启动,Docker 会把镜像里该路径的默认内容复制进卷;卷里已有内容时则反过来“压住”镜像内容,很多人在这里误解了初始化方向。
第三种:绑定挂载。直接挂宿主机目录,比如 -v /opt/app/conf:/etc/nginx。它最直观,适合配置文件、代码热更新这类“我要亲自管”的场景。代价是路径强依赖宿主机环境和权限,换台机器就可能失效;某些安全模块(SELinux/AppArmor)还会让挂载文件读不了,需要加 :ro 只读或额外打标。
选型一句话法则
- 数据库和有状态服务 → 命名卷;
- 配置文件和本地代码 → 绑定挂载;
- 一次性测试、不关心数据 → 匿名卷随缘。
再记两条通用法则:容器可写层不是存储,放进去的东西随时可能蒸发;docker system prune 会顺手清掉悬空卷,按下回车前想清楚里面有没有你舍不得的数据。
小结
数据卷的本质,是“把数据的生命周期和容器解绑”。三种写法分别对应“谁在管数据”——Docker 管、我管、随便——想清楚这一点,绝大多数持久化需求都能一眼选出正确姿势。
- 点赞
- 收藏
- 关注作者
评论(0)