你有没有遇到过这种情况:在 ref="/tag/2019/" style="color:#874873;font-weight:bold;">Docker 容器里跑了个网站,上传了一堆图片,结果一删容器,图片全没了?其实问题出在容器本身是“临时”的,里面的数据默认不会持久保存。这时候就得靠“挂载目录”来解决。
什么是挂载目录
简单说,就是把宿主机(也就是你电脑)上的一个文件夹,映射到容器里的某个路径。这样容器读写那个路径时,实际上操作的是你电脑上的文件。容器删了没关系,数据还在你硬盘上。
怎么挂载?用 -v 参数
启动容器时加上 -v 参数就能挂载。格式是:-v 宿主机路径:容器内路径。
比如你想运行一个 Nginx 容器,顺便把网页文件放在你电脑的 /home/user/mysite 里,可以这样写:
docker run -d --name myweb -p 8080:80 -v /home/user/mysite:/usr/share/nginx/html nginx
这里 /home/user/mysite 是你电脑的文件夹,/usr/share/nginx/html 是 Nginx 默认找网页的地方。现在你往 /home/user/mysite 丢个 index.html,访问 localhost:8080 就能看到。
实际场景:数据库数据保存
再举个常见的例子。用 MySQL 容器时,数据默认存在容器里。一旦容器出问题,数据就丢了。为了避免这种情况,可以把数据库文件挂载出来。
docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=123456 -v /home/user/mysql-data:/var/lib/mysql mysql:8.0
这样就算你重新部署容器,只要换个别名或者删了重建,数据还是从 /home/user/mysql-data 读取,不会丢。
小贴士:路径写绝对路径
挂载时尽量写完整的绝对路径,避免用相对路径。不然容易找不到文件,报错还不好排查。另外,权限也得注意,确保容器进程有读写权限。
和端口映射一样重要
端口映射让你能访问容器里的服务,而目录挂载则是让数据真正留下来。两者经常一起用。比如你开发一个博客项目,前端走端口映射,后端数据通过目录挂载存到本地,调试方便,也不怕崩。