我有一个演示应用程序托管在docker上.docker的公开端口为80,该应用程序在本地计算机上运行良好,我可以在localhost:8888上看到我的应用程序的登录页面。
Docker文件如下所示
FROM microsoft/aspnetcore:2.0
COPY dist /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "demoapp.dll"]
每当我将行“ EXPOSE 80 / tcp”更改为ex-“ EXPOSE 8080 / tcp”,“ EXPOSE 5000 / tcp”等以暴露除Docker容器80外的任何其他端口 如许多在线可用示例代码中所述,我无法在浏览器上运行我的应用程序。 除80以外的任何端口均不起作用。
我也可以创建图像并为应用程序创建容器。 一切正常,但是当我尝试在浏览器上运行应用程序(localhost:8080/5000/9000等)时,应用程序登录页面无法加载。
有什么想法吗?有什么建议么?为什么这一定会发生。 我需要做一些与端口相关的配置或联系我的网络团队吗?或我在这里缺少的任何代码?
预先感谢
答案 0 :(得分:0)
您应该能够暴露容器内的任何端口。
但是,您在容器启动期间在主机上发布了公开的端口。
这是通过-p
命令的docker run
标志来完成的。
当您说能够使用localhost:8888
访问应用程序时,表示您已经使用-p 8888:80
运行了docker run命令。这会将容器端口80作为端口8888发布到主机上。
要使用其他端口,只需将docker run
命令更改为-p 8888:<new exposed port>
即可,
有关更多信息,请参阅docker run命令帮助: https://docs.docker.com/v17.12/edge/engine/reference/commandline/run/#publish-or-expose-port--p-expose
发布或公开端口(-p,–expose)
$ docker run -p 127.0.0.1:80:8080 ubuntu bash
这会将容器的端口8080绑定到端口80 主机的127.0.0.1。 《 Docker用户指南》详细解释了如何在Docker中操作端口。
答案 1 :(得分:0)
如果您的应用程序在端口8080
上运行,那么请确保在运行容器时进行端口映射。
docker run -itd -p 8080:8080 <image>
这会将主机的端口8080
映射到容器内的端口8080
上。 (-p hostport:containerport)
如果您不希望端口映射,则以host
模式运行docker容器。
docker run -itd --net=host <image>
在这种情况下,您的容器使用主机网络,因此应在其中运行应用程序的任何端口。
答案 2 :(得分:0)
对于microsoft/aspnetcore
,它将ASPNETCORE_URLS
环境变量设置为http://+:80
,这意味着,如果尚未在应用程序中通过Program.cs中的app.UseUrl显式设置URL,例如,您的应用程序将在容器内的端口80上监听。
如果要更改默认端口80,则需要在UseUrls
中使用Program.cs
,如下所示,并在dockerfile中使用EXPOSE 8080/tcp
。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://+:8080")
.UseStartup<Startup>();
或者,您需要更改
之类的ASPNETCORE_URLS
环境
FROM microsoft/aspnetcore:2.0
COPY dist /app
WORKDIR /app
EXPOSE 8080/tcp
ENV ASPNETCORE_URLS=http://+:8080
ENTRYPOINT ["dotnet", "demoapp.dll"]
运行命令
docker run -it -p 8080:8080 mytest