C# .NET核心API:“;本地主机拒绝连接;当通过Docker运行时

C# .NET核心API:“;本地主机拒绝连接;当通过Docker运行时,c#,.net,docker,asp.net-core,azure-devops,C#,.net,Docker,Asp.net Core,Azure Devops,我试图通过docker运行一个简单的web api 我已经遵循了报告中提到的所有步骤 屏幕截图: docker build -t aspnetapp . docker run -d -p 8080:80 --name myapp aspnetapp dotnet publish -c Release -o out dotnet run out/ApiForDocker.dll 通过docker运行api时使用的命令: docker build -t aspnetapp . docker

我试图通过docker运行一个简单的web api

我已经遵循了报告中提到的所有步骤

屏幕截图:

docker build -t aspnetapp .
docker run -d -p 8080:80 --name myapp aspnetapp
dotnet publish -c Release -o out
dotnet run out/ApiForDocker.dll

通过docker运行api时使用的命令:

docker build -t aspnetapp .
docker run -d -p 8080:80 --name myapp aspnetapp
dotnet publish -c Release -o out
dotnet run out/ApiForDocker.dll
请注意,当我在命令行中执行以下命令时,api可以工作,因此api本身可能没有任何问题:

docker build -t aspnetapp .
docker run -d -p 8080:80 --name myapp aspnetapp
dotnet publish -c Release -o out
dotnet run out/ApiForDocker.dll
编辑:

启动设置

{
  "$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 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"]
然后在构建期间查找输出。或者,您可以将ssh连接到正在运行的容器中进行验证

$docker exec-it容器id bash

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

ENTRYPOINT[“dotnet”、“aspnetapp.dll”、“--url”、“http://*:6001”]

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

更新

现在,当您提供启动设置后:

"ApiForDocker": {
  "commandName": "Project",
  "launchBrowser": true,
  "launchUrl": "api/values",
  "applicationUrl": "https://localhost:5001;http://localhost:5000",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
}
您可以将docker入口点更新为:

ENTRYPOINT[“dotnet”、“aspnetapp.dll”、“--url”、“http://*:5000”]

然后将容器映射到主机上的
-p 5000:5000
,然后
localhost:5000/api/values
应该会在浏览器中给出该路径上的api GET响应

一个有用的调试选项是将
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"]
然后在构建期间查找输出。或者,您可以将ssh连接到正在运行的容器中进行验证

$docker exec-it容器id bash

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

ENTRYPOINT[“dotnet”、“aspnetapp.dll”、“--url”、“http://*:6001”]

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

更新

现在,当您提供启动设置后:

"ApiForDocker": {
  "commandName": "Project",
  "launchBrowser": true,
  "launchUrl": "api/values",
  "applicationUrl": "https://localhost:5001;http://localhost:5000",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
}
您可以将docker入口点更新为:

ENTRYPOINT[“dotnet”、“aspnetapp.dll”、“--url”、“http://*:5000”]



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

检查端口。您试图打开localhost:5001,但将计算机上的内部端口80映射到8080。@Edub我更正了端口。谢谢但它仍然不起作用:/请查看我的edit@Edub还有,为什么它总是说
现在正在监听:http://[:]:80
没关系,应用程序正在监听端口:80。为了清楚起见,您是用docker run-d-p5001:80启动容器的——将myapp命名为aspnetapp,对吗?如果是这样的话,我会将dockerfile更改为包含EXPOSE 80命令,以便打开端口80。然后,正如您使用端口映射时所做的那样,应用程序应该在重定向到容器端口80的主机端口中可用。请检查端口。您试图打开localhost:5001,但将计算机上的内部端口80映射到8080。@Edub我更正了端口。谢谢但它仍然不起作用:/请查看我的edit@Edub还有,为什么它总是说
现在正在监听:http://[:]:80
没关系,应用程序正在监听端口:80。为了清楚起见,您是用docker run-d-p5001:80启动容器的——将myapp命名为aspnetapp,对吗?如果是这样的话,我会将dockerfile更改为包含EXPOSE 80命令,以便打开端口80。然后,正如您使用端口映射所做的那样,应用程序应该在主机端口中可用,该端口将重定向到容器的端口80。宾果!它正在工作。这是我第一次在Docker中运行应用程序!耶!这里有几个问题:1。“applicationUrl”和“http://*:5000”之间的关系是什么?2.我可以不使用“”https://*" ? 3.如何将多个主机端口映射到单个docker端口?恭喜!好的,您正在构建一个名为kestrel的web服务器,其核心是.NET,您将其托管在一个docker容器中。1.我相信,
applicationUrl
是kestrel web服务器的启动选项。我认为
*
部分公开了接口0.0.0.0<代码>--URL
实际上是一个dotnet东西:2。不知道你的意思。3.启动容器时,只需为主机和正在运行的容器之间的端口映射添加
-p
参数。如
-p5000:5000-p3333:5000
并浏览到
localhost:5000/api/values
localhost:3333/api/values
,您将访问相同的运行容器。我的意思是我不能用https代替http,正如你提到的“http://*:5000”3。我知道我可以用-p映射端口我的意思是我可以同时将多个主机端口映射到单个docker端口吗?对于eg/
localhost:3333
localhost:3334
,两者都应映射到docker中的端口80。我想我做不到docker run-d-p 3333 4:80。当然,您可以在kestrel上使用SSL,但是您需要将您的证书放在容器中(或通过卷),然后告诉kestrel使用我相信的证书。当您在docker
run dotnet publish-c Release-o out
中运行此命令时,您的本地开发人员证书不合法,因此它是一个rele