在Docker for Windows中无法连接到ASP.Net站点
我很难从主机连接到在Docker上的Windows容器中运行的ASP.Net网站。 我可以连接到运行在Linux容器中的网站,没有任何问题。
我已经尝试连接到本地主机和分配给容器的IP端口,但在这两种情况下,我只是得到一个超时错误。
我已经尝试了几个ASP.Net示例,这些示例已经预先构build,并尝试构build自己的自定义图像。 在任何情况下,我都会得到相同的超时错误。 我也尝试卸载和重新安装docker,但没有任何改变。
我正在运行Windows 10 Pro和Docker Community Edition Version 17.03.1-ce-win12(12058)
最终,我能够使用Microsoft Vitualization清除脚本的自定义旧版本完全重置我的容器networking。 https://github.com/Microsoft/Virtualization-Documentation/tree/live/windows-server-container-tools/CleanupContainerHostNetworking这个重置我的容器networking,一切都按预期工作。
概要:
- 当使用容器的Dockerfile中的
EXPOSE
指令来定义已EXPOSE
的容器端口时,必须将-P
参数与dockerdocker run
命令一起使用,以便“激活”那些暴露的端口。 - Windows容器主机不能使用
localhost
127.0.0.1
或其外部主机IP地址访问正在运行的容器。 B.通过使用来自第二个主机B的A的IP地址,访问在给定主机上运行的容器A.也可以直接使用容器的IP地址。
完整解释:
所以确保正确的防火墙规则的创build有一些细微的差别,并且你的容器实际上可以在其发布的端口上访问。
例如,我假设你的ASP.Net容器化应用程序是由一个Dockerfile定义的容器图像定义的。 如果是这样的话,你可能使用Dockerfile的EXPOSE指令定义了映像/应用程序的发布端口。 在这种情况下,实际运行容器时,需要使用docker run
命令的“-P”参数“激活”已发布的端口。
例如,如果您的容器映像是web_app
,并且该映像的Dockerfile包含该行,则EXPOSE 80
,那么当您继续并运行该映像时,您需要执行以下操作:
C:\> docker run -P web_app
一旦容器运行,它应该在容器端口80上可用。然后,您可以继续通过浏览器查看应用程序。 要做到这一点,你有两个select:
-
您可以使用容器IP和端口从容器主机访问应用程序
使用
docker network inspect nat
查找容器IPdocker network inspect nat
,然后查找与您的容器相对应的端点/ IP地址。您还可以通过运行
docker exec <CONTAINER ID> ipconfig
为容器IP提供资金,其中<CONTAINER ID>
是您的容器的ID。您可以通过在容器主机上运行
docker ps
来获取容器的ID和容器的公开端口。 -
您可以使用容器主机IP和主机端口从另一台主机访问该应用程序
你可以使用
ipconfig
find你的主机的IP地址。您可以通过从主机运行
docker ps
来识别应用程序所在的主机端口。 然后,在PORTS
下,您将看到0.0.0.0:<HOST PORT>-><CONTAINER PORT>/TCP
格式的映射。 在这个映射<HOST PORT>
,您的应用程序在主机上可用的端口。获取容器主机的IP地址以及主机上可用的端口后,即可使用该信息从单独主机上的浏览器访问您的应用程序。
注:今天,您无法通过自己的主机以这种方式访问容器 – 尽pipe是使用
localhost
,127.0.0.1
还是使用了主机IP地址,但当前Windows容器主机无法访问正在运行的容器。