.Net6升级至.Net8后Docker容器间调用出现连接拒绝问题排查
问题:.NET8多容器Docker环境下WebFrontEnd调用WebApi连接拒绝
- 基于官方多容器教程的示例项目,.NET6版本可正常运行
- 升级至.NET7无异常,但升级到.NET8后,WebFrontEnd调用WebApi时触发连接拒绝错误
- WebApi可通过本地端口(如
http://localhost:53845/Counter)正常访问,但容器内通过http://webapi/Counter调用失败 - 调用代码如下:
using (var client = new System.Net.Http.HttpClient()) { // Call *mywebapi*, and display its response in the page var request = new System.Net.Http.HttpRequestMessage(); // webapi is the container name request.RequestUri = new Uri("http://webapi/Counter"); var response = await client.SendAsync(request); string counter = await response.Content.ReadAsStringAsync(); ViewData["Message"] = $"Counter value from cache :{counter}"; }
原因分析
核心是.NET8对容器化应用的默认配置变更:
- 监听端口默认值调整:.NET6/.NET7的官方ASP.NET容器镜像默认监听80端口,而.NET8镜像默认改为监听8080端口(镜像默认使用非root用户运行,无法绑定1024以下端口)
- 容器通信端口不匹配:原示例的
docker-compose.yml中WebApi的容器内端口仍配置为80,但.NET8镜像实际监听8080,导致WebFrontEnd访问http://webapi:80时无响应
适配.NET8的运行步骤
1. 更新项目.NET版本
将WebFrontEnd和WebApi项目的目标框架改为.NET 8.0,同步更新所有NuGet包至对应.NET8版本
2. 修改WebApi的Dockerfile
添加端口暴露配置,明确指定监听8080端口:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 8080 # 替换原有的EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build # 保留原有的构建逻辑...
3. 调整docker-compose.yml配置
更新WebApi的端口映射和容器内端口,确保容器间通信使用8080:
version: '3.4' services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend build: context: . dockerfile: WebFrontEnd/Dockerfile ports: - "5110:8080" # .NET8默认监听8080,本地端口可自定义 depends_on: - webapi webapi: image: ${DOCKER_REGISTRY-}webapi build: context: . dockerfile: WebApi/Dockerfile ports: - "53845:8080" # 本地端口保留原有值,容器内端口改为8080 environment: - ASPNETCORE_URLS=http://+:8080 # 显式指定监听端口,可选但更稳妥
4. 修改WebFrontEnd的调用地址
在调用代码中显式指定WebApi的8080端口:
using (var client = new System.Net.Http.HttpClient()) { var request = new System.Net.Http.HttpRequestMessage(); // 加上容器内监听的8080端口 request.RequestUri = new Uri("http://webapi:8080/Counter"); var response = await client.SendAsync(request); string counter = await response.Content.ReadAsStringAsync(); ViewData["Message"] = $"Counter value from cache :{counter}"; }
容器间通信调试方法
进入WebFrontEnd容器测试连通性
执行命令进入容器:docker exec -it <webfrontend_container_id> bash用
curl测试WebApi:curl http://webapi:8080/Counter若失败,检查两个容器是否处于Docker Compose自动创建的同一专属网络中
查看WebApi容器启动日志
确认WebApi实际监听的端口:docker logs <webapi_container_id>正常日志会显示:
Now listening on: http://[::]:8080检查容器网络配置
查看Compose创建的网络:docker network ls检查WebApi的网络归属:
docker inspect <webapi_container_id> | grep -A 10 "Networks"确认WebFrontEnd和WebApi在同一网络,且WebApi的网络别名为
webapi
内容的提问来源于stack exchange,提问作者Anders Juul
相关产品推荐
相关产品推荐

