Docker容器间HTTP请求报错:Cannot assign requested address 求助
问题诊断与解决方案
核心问题
容器内的localhost指向容器自身,而非宿主机。UI容器中请求https://localhost:44328是在尝试访问UI容器自己的44328端口,而非宿主机映射的Service服务端口,这就是报错的根本原因。
解决步骤
1. 修改API请求地址
将UI中的请求地址从https://localhost:44328改为https://my.service:443:
my.service是你在Docker Compose中定义的Service服务名,同一Docker网络内的容器可以通过服务名直接访问彼此。443是Service容器内部的服务端口(对应Compose配置中ports: - "44328:443"的容器侧端口)。
2. 处理HTTPS证书信任问题
.NET开发容器默认使用自签名证书,UI容器可能无法信任Service的证书,可在开发环境做以下配置:
- 在UI项目的
Program.cs中添加代码,允许不安全的HTTPS请求:
if (builder.Environment.IsDevelopment()) { builder.Services.AddHttpClient("MyServiceClient", client => { client.BaseAddress = new Uri("https://my.service:443"); }) .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true }); }
3. 验证网络连通性
进入UI容器内部,执行以下命令测试是否能访问Service:
docker exec -it <ui-container-name> curl https://my.service:443
如果能返回正常响应,说明网络连通性没问题,问题出在应用层配置。
4. 检查Service容器的端口监听配置
确保Service的Dockerfile或环境变量中正确设置了监听端口:
- 在Dockerfile中添加:
ENV ASPNETCORE_URLS=https://+443
- 或者在Compose配置中添加环境变量:
services: my.service: # ...其他配置 environment: - ASPNETCORE_URLS=https://+443
额外建议
建议将两个服务放到同一个Docker Compose文件中管理,简化配置和调试流程:
version: '3.4' services: my.application: image: ${DOCKER_REGISTRY-}myapplication build: context: ./path-to-ui-solution dockerfile: MY.Application/Dockerfile ports: - 44361:443 networks: - srce-network environment: - ServiceBaseUrl=https://my.service:443 my.service: image: ${DOCKER_REGISTRY-}Myservice build: context: ./path-to-service-solution dockerfile: My.Service/Dockerfile ports: - "44328:443" networks: - srce-network environment: - ASPNETCORE_URLS=https://+443 networks: srce-network: driver: bridge
内容的提问来源于stack exchange,提问作者DavidJS
相关产品推荐
相关产品推荐

