Docker端口映射与Nginx路由:从混乱到清晰
灵析和会议助手都跑在同一台ECS上,端口怎么分?Nginx怎么路由?记混端口、映射写错、容器内调不通——这篇帮你理清楚。
最终架构图
用户浏览器
↓ :80
宿主机 Nginx (lingxi-meeting.conf)
├─ / → 127.0.0.1:8080 灵析前端
├─ /api/* → 127.0.0.1:8000 灵析后端
├─ /meeting/ → 127.0.0.1:8081 会议前端
├─ /api/meeting/* → 127.0.0.1:8001 会议后端
└─ /api/setting/* → 127.0.0.1:8001
端口映射规则
| 项目 | ECS宿主机端口 | 容器内端口 | 说明 |
|---|---|---|---|
| 灵析后端 | 8000 | 8000 | uvicorn监听8000 |
| 灵析前端 | 8080 | 80 | Nginx容器 |
| 会议后端 | 8001 | 8000 | 容器内8000,对外8001 |
| 会议前端 | 8081 | 80 | Nginx容器 |
常见坑
坑1:映射写反了
会议助手compose写8001:8001,但容器内uvicorn监听的是8000 → health无响应。
正确写法:
ports:
- "8001:8000" # 宿主机8001 → 容器8000
坑2:容器内调API用错端口
容器内Nginx调后端API应该用backend:8000,不是8001——8001是宿主机端口,容器内不认。
# 容器内Nginx配置
location /api/ {
proxy_pass http://backend:8000/api/; # 不是8001
}
坑3:两个项目抢同一个端口
会议助手backend报错:
Bind for 0.0.0.0:8000 failed: port is already allocated
灵析backend已占8000,会议助手compose仍写8000:8000 → 改8001:8000。
Nginx配置要点
# /etc/nginx/conf.d/lingxi-meeting.conf
# 灵析
location / {
proxy_pass http://127.0.0.1:8080;
}
location /api/ {
proxy_pass http://127.0.0.1:8000/api/;
}
# 会议助手(注意顺序:会议api在前,避免被灵析/api/拦截)
location /api/meeting/ {
proxy_pass http://127.0.0.1:8001/api/meeting/;
}
location /api/setting/ {
proxy_pass http://127.0.0.1:8001/api/setting/;
}
location /meeting/ {
proxy_pass http://127.0.0.1:8081/;
}
踩坑总结
端口映射记住一个原则:宿主机的端口是什么,对外访问就用什么;容器内部调服务,用容器名和容器内端口。

浙公网安备 33010602011771号