【问题标题】:Cannot acces Asp.Net Core on local Docker Container无法访问本地 Docker 容器上的 Asp.Net Core
【发布时间】:2020-05-17 12:55:27
【问题描述】:

我在 asp.net core 中创建了一个应用程序,并创建了一个 dockerfile 来生成本地图像并运行它。

FROM microsoft/dotnet:latest

COPY . /app

WORKDIR /app

RUN ["dotnet", "restore"]

RUN ["dotnet", "build"]

EXPOSE 5000/tcp

ENTRYPOINT ["dotnet", "run", "--server.urls", "http://0.0.0.0:5000"]

然后,我使用以下命令构建了我的图像

docker build -t jedidocker/first .

然后,我使用以下命令创建了一个容器

docker run -t -d -p 5000:5000 jedidocker/first

但是当我在主机浏览器中运行以下网址时

http://localhost:5000/

我有一个ERR_EMPTY_RESPONSE

是网络问题吗?我该如何解决?

P.S: 我的 windows 版本是 10.0.10586

【问题讨论】:

    标签: asp.net docker


    【解决方案1】:

    我遇到了同样的问题并找到了解决方案。您将需要更改默认侦听主机名。默认情况下,应用程序将侦听 localhost,忽略来自容器外部的任何传入请求。更改program.cs 中的代码以监听所有来电:

    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseUrls("http://*:5000")
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();
    
            host.Run();
        }
    }
    

    更多信息:

    https://medium.com/trafi-tech-beat/running-net-core-on-docker-c438889eb5a#.hwhoak2c0

    确保您正在运行带有-p 标志和端口绑定的容器。

    docker run -p 5000:5000 <containerid>
    

    在撰写本文时,似乎

    EXPOSE 5000:5000
    

    命令与-p 命令的效果不同。我在使用 -P(大写)方面也没有取得真正的成功。

    2016 年 8 月 28 日编辑:

    有一点需要注意。如果您使用带有 -d(分离)模式的 docker compose,dotnet run 命令可能需要一段时间才能启动服务器。在执行完命令(以及之前的任何其他命令)之前,您将在Chrome 中收到ERR_EMPTY_RESPONSE

    【讨论】:

    • 有效!只是增加答案细节,通常,当您创建应用程序时,此设置设置为http://localhost:8080 或类似的东西。它在本地环境中运行良好,但是,如果您像我一样尝试从 docker 容器中运行它,则 localhost 是另一台机器(在容器内),因此,您必须接受外部的所有请求或将其设置为接受主机 IP 地址(运行 docker 引擎的机器)。所以,打开它到网络,使用*:port :)
    • 仅当您只打算在 docker 本地运行应用程序时才有效,因为端口号是硬编码的,并且与 launchSettings.json 中定义的其他配置文件不同
    【解决方案2】:

    只需按如下方式更新您的入口点,无需更改代码:

    ENTRYPOINT ["dotnet", "run", "--server.urls", "http://*:5000"]
    

    Windows Server 2016 上的默认 Docker 网络是 NAT,因此您可能希望使用可以通过docker inspect &lt;container name/ID&gt; 找到的 IP。不确定其他 Windows 版本是否也是如此。

    【讨论】:

    • Balint,你能解释一下为什么会这样吗?它解决了我的问题,但我不确定我明白为什么。
    • @tylerjgarland 它将让 dotnet 监听所有 IP 地址(接口),而不仅仅是 localhost(环回)
    • 截至 2018 年 5 月 VS2017 预览版将此信息作为环境变量发送:-e "ASPNETCORE_URLS=https://+:443;http://+:80" -e "ASPNETCORE_HTTPS_PORT=44341"
    【解决方案3】:

    这就是在 ASP.NET 3.1 中对我有用的方法

    在Dockerfile上你需要指定ENV ASPNETCORE_URLS

    ENV ASPNETCORE_URLS http://*:5000
    

    然后暴露端口

    EXPOSE 5000
    

    【讨论】:

      【解决方案4】:

      使用HostUrl 作为环境变量

      appsettings.json

      {
        "Logging": {
          "IncludeScopes": false,
          "Debug": {
            "LogLevel": {
              "Default": "Warning"
            }
          }
        },
        "HostUrl": "http://*:8080"
      }
      

      program.cs

      public class Program
      {
          public static void Main(string[] args)
          {
              var hosturl = configuration.GetSection("HostUrl").Value;
              var host = new WebHostBuilder()
                  .UseKestrel()
                  .UseContentRoot(Directory.GetCurrentDirectory())
                  .UseUrls(hosturl)
                  .UseIISIntegration()
                  .UseStartup<Startup>()
                  .Build();
      
              host.Run();
          }
      }
      

      然后,您可以覆盖 HostUrl 作为 docker run 上的环境参数

      docker run --rm -it -e HostUrl="http://*:80" -e DOTNET_RUNNING_IN_CONTAINER=true -e ConnectionStrings__DefaultConnection="<your_connection>" -p 80:80 <containerid>
      

      打开浏览器localhost 开心!

      【讨论】:

        猜你喜欢
        • 2019-11-05
        • 2022-01-07
        • 2017-11-08
        • 1970-01-01
        • 2021-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-26
        相关资源
        最近更新 更多