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

.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对容器化应用的默认配置变更:

  1. 监听端口默认值调整:.NET6/.NET7的官方ASP.NET容器镜像默认监听80端口,而.NET8镜像默认改为监听8080端口(镜像默认使用非root用户运行,无法绑定1024以下端口)
  2. 容器通信端口不匹配:原示例的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}";
}

容器间通信调试方法

  1. 进入WebFrontEnd容器测试连通性
    执行命令进入容器:

    docker exec -it <webfrontend_container_id> bash
    

    用curl测试WebApi:

    curl http://webapi:8080/Counter
    

    若失败,检查两个容器是否处于Docker Compose自动创建的同一专属网络中

  2. 查看WebApi容器启动日志
    确认WebApi实际监听的端口:

    docker logs <webapi_container_id>
    

    正常日志会显示:Now listening on: http://[::]:8080

  3. 检查容器网络配置
    查看Compose创建的网络:

    docker network ls
    

    检查WebApi的网络归属:

    docker inspect <webapi_container_id> | grep -A 10 "Networks"
    

    确认WebFrontEnd和WebApi在同一网络,且WebApi的网络别名为webapi

内容的提问来源于stack exchange,提问作者Anders Juul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:55:28