首页 > 解决方案 > docker容器中的.net core rest api未运行

问题描述

我对容器化很陌生。我使用默认模板在 Visual Studio 中创建了一个新的 .net core 3.1 rest api。我没有更改默认模板中的任何内容。当我使用 F5 运行它时,它在带有 url https://localhost:44332/weatherforecast 的浏览器中运行良好。现在,我正在尝试使用以下 Dockerfile 配置在 docker 容器中运行它:

来自 mcr.microsoft.com/dotnet/aspnet:3.1

COPY bin/Release/netcoreapp3.1/publish App/

工作目录/应用

曝光 5000

暴露 443

入口点 ["dotnet", "CoreRestApi.dll"]

我能够生成 docker 映像和容器。容器也开始了。但是当我尝试以 https://localhost/weatherforecast 或 http://localhost:5000/weatherforecast 浏览 url 来访问 api 时,它什么也没有显示。

应用程序中 Main 方法的代码如下:

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>(); 
            });

docker 桌面显示以下内容:

在此处输入图像描述

我在这里错过任何一步吗?

标签: dockerasp.net-core

解决方案


在您的应用程序的输出中,您可以看到它正在侦听端口 80 ( Now listening on: http://[::]:80)。

因此,当您运行容器时,您应该将端口 80 映射到主机上的空闲端口。假设我们选择端口 51234。然后你会做

docker run -d -p 51234:80 <your-image-name>

然后你就可以访问 APIhttp://localhost:51234/weatherforecast

Dockerfile 中的 EXPOSE 语句实际上并没有做任何事情。您可以将它们视为有关您使用的端口的文档。好的当然是用一个语句替换您拥有的两个 EXPOSE 语句EXPOSE 80,但这不会阻止您的容器工作。


推荐阅读