Docker中Nginx反向代理容器如何访问宿主机端口
Docker环境下Nginx容器访问宿主机本地服务配置方案
推荐方案:使用Docker内置宿主机解析(无侵入,不影响现有容器通信)
- Docker 20.04 及以上版本默认内置专用域名
host.docker.internal,该域名自动解析到宿主机地址,不会破坏现有同网络容器通过服务名互访的能力,你现有的supersite:80这类访问规则完全不需要改动。 - 直接在Nginx的转发配置中,将指向宿主机Golang服务的地址写为
http://host.docker.internal:10000即可。 - 如果你使用的是Linux环境下的旧版本Docker,只需要在docker-compose.yml的
proxy服务段新增一行extra_hosts配置,不需要调整其他网络、端口或服务配置:
services: proxy: image: nginx:1.19.10 restart: on-failure volumes: - ./proxy/nginx.conf:/etc/nginx/nginx.conf - ./proxy/sites/:/etc/nginx/sites/ - /etc/letsencrypt/:/etc/letsencrypt:ro expose: - 80 - 443 ports: - "80:80" - "443:443" container_name: "kj_proxy" # 新增以下配置即可 extra_hosts: - "host.docker.internal:host-gateway" supersite: # 原有配置保持不变
- 配置修改完成后,执行
docker compose up -d proxy重启代理容器即可生效。
备选方案:使用Docker网桥网关地址(适配极老版本Docker)
如果你的Docker版本过低不支持host-gateway参数,可以直接使用Docker网桥的默认网关IP访问宿主机:
- 执行命令查询proxy容器所在网络的网关地址:
docker inspect kj_proxy | grep Gateway - 绝大多数默认安装的Docker环境,网桥网关地址为
172.17.0.1,直接在Nginx配置中转发到http://172.17.0.1:10000即可。
配置验证与注意事项
- 宿主机上运行的Golang服务不能仅监听
127.0.0.1,需要监听0.0.0.0或者对应Docker网桥的网段地址,否则容器发起的访问会被宿主机防火墙或服务监听规则拦截。 - 容器重启后可以进入容器执行
curl http://host.docker.internal:10000验证连通性,确认返回正常后再重载Nginx配置即可。 - 上述所有配置都不会修改现有自定义Docker网络的解析规则,原有通过服务名访问同网络其他容器的逻辑完全不受影响。
内容的提问来源于stack exchange,提问作者Kristi Jorgji
相关产品推荐
相关产品推荐

