无法访问本地 Docker 容器上的 Asp.Net Core

11

我创建了一个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

但是当我将以下URL在我的主机浏览器中运行时:
http://localhost:5000/

我遇到了一个ERR_EMPTY_RESPONSE错误。
这是一个网络问题吗?该如何解决?
附注:我的Windows版本是10.0.10586。
4个回答

24

我曾经遇到过同样的问题,并找到了解决方法。您需要更改默认的监听主机名。 默认情况下,应用程序将侦听本地主机,忽略来自容器外部的任何传入请求。 在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错误提示。


1
它可以工作!只需增加答案细节,通常情况下,当您创建应用程序时,此设置设置为http:// localhost:8080或类似设置。在本地环境中,它可以很好地工作,但是,如果您像我一样尝试从docker容器中运行它,则localhost是另一台机器(在容器内部),因此,您必须接受所有外部请求或将其设置为接受主机IP地址(运行docker引擎的机器)。因此,打开它以供Web使用,使用*:port :) - Lazaro Fernandes Lima Suleiman
1
只有在Docker本地运行应用程序时才能正常工作,因为端口号是硬编码的,并且与“launchSettings.json”中定义的其他配置文件不同。 - Thomas Eyde

8

只需更新您的入口点如下,无需更改任何代码:

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

Windows Server 2016 上 Docker 的默认网络是 NAT,因此您可能想使用您可以通过 docker inspect <container name/ID> 找到的 IP。不确定其他 Windows 版本是否也是这种情况。


Balint,你能解释一下为什么这个方法有效吗?它确实解决了我的问题,但是我不确定我理解其中的原因。 - tylerjgarland
@tylerjgarland 它将使dotnet监听所有IP地址(接口),而不仅仅是localhost(环回)。 - Balint Bako
1
截至2018年5月,VS2017 Preview将此信息作为环境变量发送:-e“ASPNETCORE_URLS = https://+:443; http://+:80” -e“ASPNETCORE_HTTPS_PORT = 44341” - ssmith

4

以下是我在ASP.NET 3.1中使用的方法:

Dockerfile中需指定ENV ASPNETCORE_URLS

ENV ASPNETCORE_URLS http://*:5000

接下来暴露端口

EXPOSE 5000

0

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();
    }
}

然后,您可以在docker run命令中作为环境参数覆盖HostUrl。

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

localhost 打开浏览器,然后愉快地享受吧!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接