Docker for Windows:无法在Windows容器模式下的暴露端口上访问服务

我正在使用下面的Dockerfiles来创build一个运行Jenkins的容器,在运行Docker for Windows 17.03的Windows 10桌面上的Windows容器中

FROM microsoft/windowsservercore RUN powershell -Command wget 'http://javadl.oracle.com/webapps/download/AutoDL?BundleId=210185' -Outfile 'C:\jreinstaller.exe' ; Start-Process -filepath C:\jreinstaller.exe -passthru -wait -argumentlist "/s,INSTALLDIR=c:\Java\jre1.8.0_91" ; del C:\jreinstaller.exe ENV JAVA_HOME c:\\Java\\jre1.8.0_91 RUN setx PATH %PATH%;%JAVA_HOME%\bin CMD [ "java.exe" ] 

我从这个docker文件创build图像:

 docker build -t windows-java:jre1.8.0_91 . 

我用来安装Jenkins的第二个Dockerfile:

 FROM windows-java:jre1.8.0_91 ENV HOME /jenkins ENV JENKINS_VERSION 2.58 RUN mkdir \jenkins RUN powershell -Command "wget -Uri https://updates.jenkins-ci.org/latest/jenkins.war -UseBasicParsing -OutFile /jenkins/jenkins.war" EXPOSE 8080 EXPOSE 50000 CMD java -jar C:\\jenkins\\jenkins.war docker build -t jenkins-windows:2.0 . 

然后我像这样启动容器:

 docker run --name jenkinsci -p 8080:8080 -p 50000:50000 jenkins-windows:2.0 

我可以看到容器运行良好,日志显示所有的好

 PS C:\Users\mandeep\ringba\ringba-jenkins-setup-windows\jenkins-master> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 85ba2ef525a1 jenkins-windows:2.0 "cmd /S /C 'java -..." 8 hours ago Up 8 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp jenkinsci 

但是,我无法访问在主机的Web浏览器上运行的http://localhost:8080上的jenkins服务器。

不知道是否有帮助,但是当我在同一台机器上运行Docker的Linux container模式时,我能够使用官方的docker镜像访问http://localhost:8080上的jenkins服务器。

这是目前Windows上的一个已知问题。 使用localhost / 127.0.0.1从自己的主机访问容器端点是不可能的。 今天可能使用Linux容器,因为Docker已经包含了一个特殊的解决方法,这个解决scheme是Moby / Linux在Windows上运行Linux容器的独特之处。

我们正在为此进行修复,但是今天我们build议您通过以下方式解决此问题:

  • 单独的主机访问容器端点,使用运行容器的主机的IP地址以及容器在其主机上的公开端口
  • 或通过访问同一主机上容器 ,使用容器的内部IP地址和发布的端口(您可以使用docker network inspect <network name>docker exec <container ID> ipconfig>来获取容器端点本身的IP地址)

要完成@ Kallie-Microsoft post:

docs.docker.com已更新为本地主机和已发布端口的Windows容器的限制


用于Windows的Docker提供了切换Windows和Linux容器的选项。 如果您使用的是Windows容器,请记住,由于当前实施的Windows NAT(WinNAT),networking方面存在一些限制。 随着Windows容器项目的发展,这些限制可能会得到解决。

您可能会立即遇到的一件事情是Windows容器上发布的端口不会回环到本地主机。 而只能使用容器的IP和端口从主机访问容器端点。

所以,在你使用Docker来拉取图像并运行一个像这样的命令的web服务器的情况下:

 docker run -d -p 80:80 --name webserver nginx 

使用curl http:// localhost ,或者在http:// localhost指向你的web浏览器将不会显示nginx网页(就像使用Linux容器一样)。

为了从本地主机到达Windows容器,您需要指定运行该服务的容器的IP地址和端口。

您可以通过使用docker检查一些格式选项和容器的ID或名称来获取容器的IP地址。 对于上面的示例,命令将如下所示,使用我们给容器(web服务器)的名称而不是容器ID:

 $ docker inspect \ --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \ webserver