我遵循了以下指南: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 myapp
,docker run -p 80:5000 myapp
,我也尝试了不同的端口,例如docker run -d -p 5000:5000 myapp
,但似乎没有任何效果。
我在我的Windows机器和我的Linux服务器上都尝试了这个,但它们都不起作用。
我可以在没有泊坞窗的情况下运行dnx web
,一切都按预期工作。
答案 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连接...通过此更改,您可以从任何源进行连接。