大家好我是舒一笑不秃头,喜欢写作和分享,更多精彩内容~
在实际部署前端项目时,我们经常会用到这样的镜像:
sql
FROM nginx:stable-alpine
COPY default.conf /etc/nginx/conf.d/default.conf
COPY dist /usr/share/nginx/html
EXPOSE 8000
看起来很简单对吧?
👉 但一旦你想动态修改 nginx 配置,问题就来了:
❓ 难道每改一次配置都要重新 build 镜像?
当然不需要!正确方式是:使用 docker-compose 挂载外部配置文件
今天这篇文章,带你彻底搞懂 👇
🧠 一、核心原理(一定要搞懂)
Docker 镜像里这句:
arduino
COPY default.conf /etc/nginx/conf.d/default.conf
👉 本质只是"拷贝一次"
而 Docker 提供了更高级的能力:
✅ volume 挂载可以直接覆盖容器内文件
优先级:
volume > 镜像内文件
所以:
👉 我们可以用宿主机的 default.conf 覆盖容器里的配置
🛠 二、正确写法(docker-compose)
假设你的配置文件在:
arduino
/data/docker_export_zhonghui/nginx/default.conf
那么 docker-compose.yml 写法如下:
javascript
services:
torchv_web:
image: harbor.torchv.com/ais/rag-web:202603250947-master
container_name: torchv_web
ports:
- "80:80"
volumes:
- /data/docker_export_zhonghui/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
📁 三、推荐目录结构
arduino
/data/docker_export_zhonghui/
└── nginx/
└── default.conf
⚠️ 四、90%的人都会踩的坑
❌ 坑1:路径写成相对路径
错误写法:
javascript
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
👉 在服务器部署时,经常路径不对!
✅ 正确:
javascript
- /data/docker_export_zhonghui/nginx/default.conf:/etc/nginx/conf.d/default.conf
❌ 坑2:文件不存在(最常见)
如果宿主机文件不存在:
👉 Docker 会自动创建一个目录!
结果:
nginx 启动失败 ❌
检查方式:
bash
ls /data/docker_export_zhonghui/nginx/default.conf
❌ 坑3:端口对不上(隐蔽坑)
Dockerfile 写:
yaml
EXPOSE 8000
但 nginx 默认是:
arduino
listen 80;
👉 EXPOSE 没任何实际作用(只是声明)
所以你必须确认:
✅ 推荐统一:
arduino
listen 80;
然后:
makefile
ports:
- "80:80"
❌ 坑4:权限问题
如果 nginx 报错:
permission denied
解决:
bash
chmod 644 /data/docker_export_zhonghui/nginx/default.conf
❌ 坑5:改了配置不生效
很多人改完文件发现:
👉 页面没变化
原因:
👉 容器没重建
正确操作:
css
docker compose up -d --force-recreate
或者:
docker compose down
docker compose up -d
🔥 五、进阶玩法(推荐)
如果你有多个配置文件,可以直接挂整个目录:
javascript
volumes:
- /data/docker_export_zhonghui/nginx:/etc/nginx/conf.d:ro
👉 优点:
- 支持多站点
- 配置更灵活
- 更接近生产环境
🧪 六、验证是否生效
进入容器:
bash
docker exec -it torchv_web sh
查看配置:
bash
cat /etc/nginx/conf.d/default.conf
测试 nginx:
nginx -t
✅ 七、总结一句话
👉 Docker 修改 nginx 配置的最佳实践:永远用 volume 挂载,而不是重新 build 镜像