繁体   English   中英

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

[英]Cannot acces Asp.Net Core on local Docker Container

我已经在 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

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

PS:我的windows版本是10.0.10586

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

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

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

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

这是在 ASP.NET 3.1 中对我有用的内容

在 Dockerfile 上需要指定 ENV ASPNETCORE_URLS

ENV ASPNETCORE_URLS http://*:5000

然后暴露端口

EXPOSE 5000

使用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打开浏览器很高兴!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM