无法在本地Docker Container上访问Asp.Net Core

时间:2016-08-19 18:36:02

标签: asp.net docker

我在asp.net核心创建了一个应用程序并创建了一个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

4 个答案:

答案 0 :(得分:13)

我遇到了同样的问题并找到了解决方法。您需要更改默认侦听主机名。默认情况下,应用程序将侦听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日:

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

答案 1 :(得分:5)

只需更新您的入口点,不需要更改代码:

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

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

答案 2 :(得分:1)

这是在ASP.NET 3.1中对我有用的东西

在Dockerfile上,您需要指定ENV ASPNETCORE_URLS

ENV ASPNETCORE_URLS http://*:5000

然后暴露端口

EXPOSE 5000

答案 3 :(得分: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();
    }
}

然后,您可以将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打开浏览器,感到高兴!