你有没有遇到过这样的情况:在 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
名字明确,备份迁移都方便,还能跨容器共享。
挂载目录不是高深技术,却是用好容器的关键一步。搞明白它,才能真正把容器当成服务来用,而不是玩具。”}