.NET Core API:通过 Docker 运行时“本地主机拒绝连接”

Sam*_*ack 8 .net c# docker azure-devops asp.net-core

我正在尝试通过 docker 运行一个简单的 Web api。

我已遵循文档中提到的所有步骤。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

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

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
Run Code Online (Sandbox Code Playgroud)

截屏:

在此输入图像描述 在此输入图像描述

我用来通过 docker 运行 api 的命令:

docker build -t aspnetapp .
docker run -d -p 8080:80 --name myapp aspnetapp
Run Code Online (Sandbox Code Playgroud)

请注意,当我在命令行中执行以下命令时,API 会起作用,因此 API 本身可能没有任何问题:

dotnet publish -c Release -o out
dotnet run out/ApiForDocker.dll
Run Code Online (Sandbox Code Playgroud)

编辑:

在此输入图像描述

启动设置

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:63852",
      "sslPort": 44318
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "ApiForDocker": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 18

我是 docker 新手,在创建新的 mvc 核心项目时遇到了同样的问题,在 VS2019 上使用 docker 调试器,尝试了很多东西,终于得到了我的答案:https: //stackoverflow.com/a/69036711/12537072 感谢@ChinaHelloWorld,只需编辑“launchSettings.json”并将“publishAllPorts”更改为false

"Docker": {
    "commandName": "Docker",
    "launchBrowser": true,
    "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
    "publishAllPorts": false,
    "useSSL": true
}
Run Code Online (Sandbox Code Playgroud)


Hen*_*ous 1

对我来说看起来不错。

一个有用的调试选项是添加RUN ls -al到运行时步骤,以确保您的目标是正确的app-name.dll条目。

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY --from=build-env /app/out .
RUN ls -al
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
Run Code Online (Sandbox Code Playgroud)

然后在构建期间查找输出。或者您可以通过 ssh 进入正在运行的容器来验证它。

$ docker exec -it container-id bash

另外,您始终可以尝试切换到另一个端口Properties > launchSettings.json,然后Dockerfile使用该端口和--urls-args 更新您的入口点,例如:

ENTRYPOINT ["dotnet", "aspnetapp.dll", "--urls", "http://*:6001"]

然后您还需要在主机上映射该端口-p 8080:6001。还要确保您的容器也在侦听该接口(0.0.0.0)。

更新

现在,当您提供了 launchSettings 后:

"ApiForDocker": {
  "commandName": "Project",
  "launchBrowser": true,
  "launchUrl": "api/values",
  "applicationUrl": "https://localhost:5001;http://localhost:5000",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以将 docker 入口点更新为:

ENTRYPOINT ["dotnet", "aspnetapp.dll", "--urls", "http://*:5000"]

并将容器映射到主机上-p 5000:5000,然后localhost:5000/api/values应该在浏览器中的该路由上为您提供 API GET 响应。

  • 答对了!现在正在工作。这是我第一次在 Docker 中运行应用程序!耶!这里有几个问题: 1.“applicationUrl”和“http://*:5000”之间的关系是什么?2. 我可以不使用“"https://*”吗? 3. 如何将多个主机端口映射到单个 docker 端口? (2认同)