Docker Compose中.NET主API调用次级API连接被拒问题
解决Docker Compose中.NET容器间API调用连接拒绝问题
问题分析
你遇到的核心矛盾是:代码指定调用http://mocktarjeta:80/api/Tarjeta,但异常显示尝试连接mocktarjeta:14332(宿主机映射端口)并被拒绝。这一般由以下几个原因导致:
mocktarjeta容器内部的.NET服务未正确监听80端口- 代码中的URL被配置文件/环境变量覆盖
- 容器间网络或协议配置存在冲突
解决方案步骤
1. 验证mocktarjeta的内部端口监听配置
先确认mocktarjeta服务在容器内确实监听80端口:
- 检查
MockTarjeta/Dockerfile,确保包含EXPOSE 80 443指令,暴露内部端口 - 查看
Program.cs的启动配置,确保启用HTTP监听(.NET 6+默认已包含,但需确认未被修改):var builder = WebApplication.CreateBuilder(args); // 明确指定监听HTTP和HTTPS端口 builder.WebHost.UseUrls("http://+:80", "https://+:443"); var app = builder.Build(); // ...其他中间件配置 app.Run(); - 检查
appsettings.json,确保Urls配置未移除HTTP端口:{ "Urls": "http://+:80;https://+:443", // ...其他配置项 }
2. 排查代码中URL是否被覆盖
检查是否有配置文件或环境变量替换了硬编码的URL:
- 搜索项目中是否存在类似
MockTarjetaUrl的配置项,比如:{ "MockTarjetaUrl": "http://localhost:14332/api/Tarjeta" } - 确认代码中确实使用了硬编码的容器内部地址,而非读取错误的配置:
// 错误示例:读取了指向宿主机的配置 // string apiUrl = Configuration["MockTarjetaUrl"]; // 正确写法: string apiUrl = "http://mocktarjeta:80/api/Tarjeta";
3. 处理HTTPS证书问题(若改用443端口调用)
如果mocktarjeta仅启用HTTPS服务,容器间调用时需要处理自签名证书的信任问题:
- 将调用地址改为
https://mocktarjeta:443/api/Tarjeta - 在
HttpClient中添加证书忽略逻辑(仅开发环境使用,生产环境需配置信任证书):using (HttpClient client = new HttpClient(new HttpClientHandler { ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true })) { // ...你的请求逻辑 }
4. 确认Docker Compose网络配置
Docker Compose默认会为所有服务创建统一桥接网络,但如果手动配置了自定义网络,需确保所有服务都加入该网络:
version: '3.4' networks: acme-network: driver: bridge services: acmeapi: # ...原有配置 networks: - acme-network mocktarjeta: # ...原有配置 networks: - acme-network # 其他服务(sqlserver、mockfactura等)也需添加networks配置
5. 测试容器间连通性
进入acmeapi容器,用curl直接测试连接,定位问题节点:
# 进入acmeapi容器 docker exec -it acmeapi bash # 测试HTTP连接 curl http://mocktarjeta:80/api/Tarjeta # 测试HTTPS连接(忽略证书) curl -k https://mocktarjeta:443/api/Tarjeta
如果curl请求失败,查看mocktarjeta的容器日志排查服务启动问题:
docker logs mocktarjeta
关键注意事项
- 容器间通信只用内部端口:永远用容器内部的80/443端口,不要用宿主机映射的14332等端口,宿主机端口仅用于外部访问
- 容器内不要用localhost:容器内的
localhost指向自身,调用其他服务必须用服务名(如mocktarjeta)
内容的提问来源于stack exchange,提问作者Alexis252
相关产品推荐
相关产品推荐

