Docker容器连接宿主CentOS7上.NET Core服务时出现连接拒绝问题
问题分析与解决方案
你的问题核心出在Angular应用发起API请求的目标地址逻辑误解,不是Docker或nginx配置的问题,具体拆解如下:
为什么Postman能访问但浏览器不行?
- Postman是直接向服务器公网地址:5000发起请求,这个请求直达你的.NET Core服务,所以正常响应。
- 当你在浏览器打开Angular应用(通过服务器公网地址:80)后,Angular代码里写的
http://localhost:5000/api/webtoken会被浏览器解析为你本地机器的localhost:5000——浏览器的localhost永远指向它自己所在的设备,而不是运行Docker的服务器,这就是为什么会出现ERR_CONNECTION_REFUSED。
你的Docker与nginx配置其实是正确的
你用--net=host启动容器,容器内的nginx确实能通过localhost:5000访问到宿主上的.NET Core服务(host网络模式下,容器和宿主共享网络命名空间);nginx的反向代理配置也没问题,它会把/api/开头的请求转发到宿主的5000端口。
修复步骤
1. 修改Angular应用的API请求路径
把Angular代码里所有硬编码的http://localhost:5000/api/改成相对路径/api/。示例:
// 原错误写法 this.http.get('http://localhost:5000/api/webtoken'); // 修改后的正确写法 this.http.get('/api/webtoken');
这样浏览器发起请求时,会自动使用当前页面的域名(你的服务器公网地址)作为基础地址,请求会发送到http://你的服务器地址/api/webtoken,被nginx拦截后转发到宿主的5000端口。
2. 重新构建并启动容器
修改完代码后,重新执行构建和启动命令:
docker build -t myservice . docker run -d -it --name=msrv --net=host myservice
可选:用环境变量实现灵活配置
如果需要在不同环境切换API地址,可以在Angular的生产环境配置文件中设置:
src/environments/environment.prod.ts:
export const environment = { production: true, apiUrl: '/api/' };
然后在代码中引用这个变量:
this.http.get(`${environment.apiUrl}webtoken`);
验证方法
打开浏览器开发者工具的Network标签,查看API请求的地址,确认请求是发送到服务器的/api/webtoken而非本地的localhost:5000,此时就能正常获取登录令牌了。
内容的提问来源于stack exchange,提问作者Nikola Novak
相关产品推荐
相关产品推荐

