无法通过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
相关产品推荐
相关产品推荐

