Docker主机网络模式下Nginx容器无法重定向至本地端口4500
核心原因:实际生效的Nginx配置并非你编写的文件
从日志里的upstream: "http://192.168.1.8:50000/admin/"能明显看出,Nginx实际执行的是指向50000端口/admin路径的代理规则,和你写的/service/指向4500的配置完全不符——这说明你的配置要么没被正确加载,要么被其他配置覆盖了。
具体排查与修复步骤:
检查宿主机挂载的配置目录冲突
你的docker-compose里挂载了./nginx/conf.d:/etc/nginx/conf.d,但Dockerfile又把本地的nginx.conf复制到容器内的/etc/nginx/conf.d/default.conf。如果宿主机的./nginx/conf.d目录已经有default.conf或其他.conf结尾的文件,这些文件会优先被加载,直接覆盖你通过Dockerfile复制的配置。修复:要么清空宿主机
./nginx/conf.d目录里的多余文件,把你的nginx.conf放进去;要么直接删掉docker-compose里的volumes挂载项,只用Dockerfile复制配置,避免冲突。查看所有生效的Nginx配置
官方Nginx镜像会加载/etc/nginx/conf.d/*.conf和/etc/nginx/nginx.conf里的所有配置,如果默认配置里有匹配优先级更高的location规则,也会导致请求被错误路由。操作:进入Nginx容器,执行
nginx -T(大写T),查看全部生效的配置内容,确认你的location /service/规则是否存在,或者有没有其他规则抢了请求的匹配权。验证宿主机4500端口的可用性
虽然Nginx用了host模式,但得确认宿主机的4500端口确实被目标HTTP容器正确映射。Linux下执行netstat -tulpn | grep 4500,Windows下执行netstat -ano | findstr :4500,检查端口是否被对应容器进程占用。
修正后的配置参考
docker-compose.yaml(去掉挂载避免冲突)
services: nginx: build: . container_name: nginx network_mode: "host"
Dockerfile(直接覆盖主配置文件)
FROM nginx:latest COPY nginx.conf /etc/nginx/nginx.conf
验证配置生效
启动容器后,进入容器执行:
nginx -T
确认输出里有你定义的location /service/规则,然后重启Nginx:
nginx -s reload
再访问http://192.168.1.8/service就能正常代理到目标服务了。
内容的提问来源于stack exchange,提问作者fyodor-the-ignorant

