无法从docker

时间:2015-11-28 23:05:50

标签: c# asp.net linux docker asp.net-core

我遵循了以下指南:Running ASP.NET 5 applications in Linux Containers with Docker我无法在Windows PC或Linux服务器上运行此功能。我的dockerfile如下所示:

FROM microsoft/aspnet

COPY . /app
WORKDIR /app
RUN ["dnu", "restore"]

EXPOSE 5000/tcp
ENTRYPOINT ["dnx", "-p", "project.json", "web"]

然后我运行docker build -t myapp .然后docker run -d -p 80:5000 myapp它说它正在运行但我无法在浏览器中打开网站。我知道在Windows上你应该找到实际虚拟机运行的IP地址,使用docker-machine ip default最后成为192.168.99.100但是当我导航到http://192.168.99.100时我才得到通用"此网页不可用"错误信息。我也尝试了这个docker run命令的不同变体,例如docker run -it -p 80:5000 myappdocker run -p 80:5000 myapp,我也尝试了不同的端口,例如docker run -d -p 5000:5000 myapp,但似乎没有任何效果。

我在我的Windows机器和我的Linux服务器上都尝试了这个,但它们都不起作用。

我可以在没有泊坞窗的情况下运行dnx web,一切都按预期工作。

4 个答案:

答案 0 :(得分:6)

在这里查看我的答案:ASP.NET 5.0 beta 8 in Docker doesn't start

基本上,Docker会在0.0.0.0网络接口上将请求转发到您的容器,但Kestrel默认只在localhost上进行侦听。

所以是的,请求被传递到您的docker容器,但Kestrel Web服务器不接受它们。因此,您需要覆盖其他人发布的server.urls属性:

ENTRYPOINT ["dnx", "web", "--server.urls", "http://0.0.0.0:5000"]

然后你应该看到:

Now listening on: http://0.0.0.0:5000

运行容器时。您还可以执行快速docker ps命令来验证0.0.0.0实际上是Docker转发请求的网络接口。

我还写了一些关于如何让Windows 5在Windows上运行Docker的问题 - 由于Docker不仅要将请求转发到容器,因此我们必须让VirtualBox传递请求。到Docker虚拟机boot2docker(在Virtual Box中通常称为default)之前,Docker可以将它们移交给我们的容器。

帖子在这里:http://dotnetliberty.com/index.php/2015/10/25/asp-net-5-running-in-docker-on-windows/

答案 1 :(得分:3)

要更全面地了解您的应用环境,请发布您的project.json文件以及您正在使用的ASP.net测试版。

现在你可以尝试通过取出" project.json"来清理你的Dockerfile。和" -p"来自ENTRYPOINT指令的参数,从EXPOSE命令中删除tcp,最后指定" - server.urls" ENTRYPOINT指令中的参数,以便它使用0.0.0.0而不是默认的localhost,如下所示:

FROM microsoft/aspnet

COPY . /project        
WORKDIR /project       
RUN ["dnu", "restore"]

EXPOSE 5000

ENTRYPOINT ["dnx", "web", "--server.urls"]

或者,您可以尝试完全删除EXPOSE命令并在ENTRYPOINT指令中公开docker端口5000,如下所示:

FROM microsoft/aspnet

COPY . /project        
WORKDIR /project       
RUN ["dnu", "restore"]

ENTRYPOINT ["dnx", "web", "--server.urls", "http://0.0.0.0:500"]

无论哪种方式,您都可以构建容器并使用以下内容运行它:

$ docker run -it -p 80:5000 myapp

答案 2 :(得分:2)

对于现在在RC2中遇到此问题的任何人,命令不再存在。您必须通过链接.UseUrls(" http://0.0.0.0:5000")来更新Program.cs。您也可以从5000更改为此处所需的端口。

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

        host.Run();
    }
}

答案 3 :(得分:1)

您可以在此处找到Docker和ASP.NET Core RC1的有用的分步教程: https://www.sesispla.net/blog/language/en/2015/12/recipe-asp-net-5-net-core-to-the-docker-container/

您可能缺少的棘手部分是修改projects.json命令,如下所示:

  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel --server.urls http://0.0.0.0:5000"
  },

默认情况下,kestrel只接受localhost连接...通过此更改,您可以从任何源进行连接。