You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:01:04