Docker Compose 挂载 Nginx 配置的正确姿势(90%的人都踩过这个坑)

大家好我是舒一笑不秃头,喜欢写作和分享,更多精彩内容~

在实际部署前端项目时,我们经常会用到这样的镜像:

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 镜像

相关推荐
Decay__6 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
贞明电子7 小时前
工业三色报警灯怎么接入项目系统?开关量与RS485控制应用指南
运维·网络·微信公众平台·贞明电子
万联WANFLOW8 小时前
海外网络故障怎么排查?Cloudflare 三季度断网报告解读与 mtr 实战
运维·网络·故障分析
Ruiery10 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
Decay__11 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
江华森13 小时前
数据中心基础设施运维实战:概述与实验环境搭建
运维
迪菲赫尔曼13 小时前
【基础篇 11】把官方源码放到服务器:版本、解压层级和安装位置,一次弄清楚
运维·服务器·开发语言·人工智能·python·yolo·目标检测
by2099914 小时前
Linux GCC/G++ 编译与 Makefile 构建
linux·运维·服务器·经验分享
螺丝钉tina14 小时前
[Playwright][08] Upload 模块自动化:如何设计真实业务测试用例?
运维·自动化·测试用例
迪菲赫尔曼15 小时前
【基础篇 12】把环境与源码接起来:检查 GPU,再安装服务器上的项目
运维·服务器·开发语言·人工智能·python·yolo·目标检测