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

无法通过Docker容器访问.NET Core应用的问题求助

Docker Compose部署.NET Core应用端点无法访问问题解决

本地运行指定命令时,应用可正常通过https://localhost:5001或http://localhost:5000访问;但docker compose up启动后,CLI显示应用已运行,HTTP/HTTPS端点却无法访问:测试https://localhost:5001/api/health时,HTTP请求返回“socket hang up”,HTTPS请求返回“client network socket disconnected before secure TLS connection was established”。docker ps显示端口映射正常,docker inspect网络配置无异常。

相关配置文件

Docker Compose文件

version: "3.4"
services:
    app:
        build:
            context: .
            dockerfile: Dockerfile
        ports:
            - 5000:5000
            - 5001:5001

Dockerfile

# syntax=docker/dockerfile:1
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app
    
# Install EF tools      
RUN dotnet tool install --global dotnet-ef
ENV PATH="${PATH}:/root/.dotnet/tools"  

# Generate Certificates
RUN dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p TestPassword
RUN dotnet dev-certs https --trust

# Copy everything else and build
COPY . ./
COPY Setup.sh Setup.sh
RUN dotnet restore
RUN dotnet build -c Release -o out

# Build runtime image
RUN chmod +x ./Setup.sh
CMD /bin/bash ./Setup.sh

Setup.sh入口文件

#!/bin/bash

set -e
run_cmd="dotnet run --project Artis.Merchant.API/Artis.Merchant.API.csproj --launch-profile Artis.Merchant.API"

until dotnet ef database update --project Artis.Models/Artis.Models.csproj; do
>&2 echo "SQL Server is starting up"
sleep 1
done

>&2 echo "SQL Server is up - executing command"
exec $run_cmd

项目启动设置(launchSettings.json)

"profiles": {
    "Artis.Merchant.API": {
    "commandName": "Project",
    "launchBrowser": true,
    "launchUrl": "swagger",
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Local"
    },
  "applicationUrl": "https://localhost:5001;http://localhost:5000"
},

Program.cs入口文件

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureAppConfiguration((context, configBuilder) =>
                {
                    string assemblyName = Assembly.GetExecutingAssembly().GetName().Name;
                    string envName = context.HostingEnvironment.EnvironmentName;
                    configBuilder.Sources.Clear();
                    configBuilder.AddJsonFile($"{assemblyName}.appsettings.json", optional: false, reloadOnChange: true);
                    configBuilder.AddJsonFile($"{assemblyName}.appsettings.{envName}.json", optional: true, reloadOnChange: true);
                });
                webBuilder.UseStartup<Startup>();
            });
}

解决方法

在appsettings.json中添加Kestrel配置,将监听地址指定为0.0.0.0:

"Kestrel": {
    "Endpoints": {
      "Http": {
        "Url":  "http://0.0.0.0:5000"
      },
      "Https": {
        "Url": "https://0.0.0.0:5001"
      }
    },
    "EndpointDefaults": {
      "Url": "https://0.0.0.0:5001",
      "Protocols": "Http1"
    }
  }

原因说明

容器内应用若绑定到localhost,仅容器内部可访问,外部主机无法通过端口映射建立连接。将Kestrel绑定到0.0.0.0后,应用会监听容器的所有网络接口,外部主机即可通过映射的端口正常访问服务。

内容的提问来源于stack exchange,提问作者Dillon Drobena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:40:23