常识来了
白蓝主题五 · 清爽阅读
首页  > 软件进阶

容器挂载目录:让数据在容器内外自由流动

你有没有遇到过这样的情况:在 Docker 里跑了个服务,比如博客系统,结果一重启容器,文章全没了?其实问题就出在数据没存对地方。容器本身是临时的,里面的数据随容器生灭。这时候就得靠“容器挂载目录”来解决。

什么是挂载目录

简单说,挂载目录就是把宿主机上的某个文件夹,映射到容器里的一个路径。这样一来,容器读写这个路径时,实际操作的是宿主机的磁盘。即使容器删了重装,数据还在原来的地方。

就像你在公司用网盘同步文件,不管换哪台电脑登录,资料都在。挂载目录就是给容器配了个“数据保险箱”。

怎么挂载?用 -v 就行

启动容器时加个 -v 参数,就能完成挂载。比如要把本机的 /data/blog 映射到容器的 /app/uploads,命令是这样的:

docker run -d -v /data/blog:/app/uploads myblog:latest

冒号前面是宿主机路径,后面是容器内路径。启动后,容器往 /app/uploads 存图片,实际上都落在了宿主机的 /data/blog 里。

权限问题别忽视

有时候你会发现容器写不了文件,多半是权限不对。比如宿主机上 /data/blog 属于 root,而容器里的应用用的是普通用户。解决办法有两个:改目录归属,或者启动时指定用户。

docker run -d -v /data/blog:/app/uploads --user $(id -u):$(id -g) myblog:latest

这样容器就用当前用户的权限运行,能顺利读写挂载目录。

配置文件也能挂载

不止数据,配置也能外挂。比如 Nginx 容器,想自定义 nginx.conf,直接把本地配置文件挂进去:

docker run -d -v /myconf/nginx.conf:/etc/nginx/nginx.conf nginx

改配置再也不用进容器,也不怕更新镜像时丢设置。

临时测试用匿名挂载

有些场景不需要持久化,比如跑个临时数据库测试接口。可以用匿名卷,Docker 自己管理存储位置:

docker run -d -v /var/lib/mysql mysql

虽然路径写法一样,但因为没指定宿主机目录,Docker 会在默认位置创建卷。适合不关心数据去向的临时任务。

生产环境推荐命名卷

在正式项目中,更推荐用命名卷(named volume),管理起来更清晰:

docker volume create blog_data

docker run -d -v blog_data:/app/uploads myblog:latest

名字明确,备份迁移都方便,还能跨容器共享。

挂载目录不是高深技术,却是用好容器的关键一步。搞明白它,才能真正把容器当成服务来用,而不是玩具。”}