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

Docker Desktop for Windows:无法在Windows容器模式下访问暴露端口上的服务,docker,docker-for-windows,docker-desktop,Docker,Docker For Windows,Docker Desktop,我正在使用以下Docker文件在运行Docker desktop for windows版本17.03的windows 10桌面上的windows容器中创建一个运行Jenkins的容器 FROM microsoft/windowsservercore RUN powershell -Command wget 'http://javadl.oracle.com/webapps/download/AutoDL?BundleId=210185' -Outfile 'C:\jreinstaller.e

我正在使用以下Docker文件在运行Docker desktop for windows版本17.03的windows 10桌面上的windows容器中创建一个运行Jenkins的容器

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文件创建图像:

docker build -t windows-java:jre1.8.0_91 .
我正在使用的第二个Dockerfile在上面安装Jenkins:

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
docker run -d -p 80:80 --name webserver nginx
我可以看到容器运行良好,日志显示良好

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
但是,我无法访问运行在
http://localhost:8080
在主机的web浏览器上

不确定这是否有帮助,但当我在同一台机器上以
Linux容器
模式运行docker时,我能够访问
http://localhost:8080

使用他们的官方docker形象

这是Windows上目前已知的问题。无法使用localhost/127.0.0.1从自己的主机访问容器端点。现在使用Linux容器是可能的,因为Docker提供了一种特殊的解决方法,这是他们在Windows上运行Linux容器的Moby/Linux实现所独有的

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

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

要完成@Kallie Microsoft post:

docs.docker.com已更新为一节


Docker for Windows提供了切换Windows和Linux的选项 容器。如果您使用的是Windows容器,请记住 由于以下原因,在联网方面存在一些限制: Windows NAT(WinNAT)的当前实现。这些限制可能会 可能会随着Windows容器项目的发展而解决

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

因此,在使用Docker提取图像并运行 使用如下命令的Web服务器:

docker run --name jenkinsci -p 8080:8080 -p 50000:50000  jenkins-windows:2.0
docker run -d -p 80:80 --name webserver nginx
使用curl,或将web浏览器指向 不会显示nginx网页(就像它会显示的那样 使用Linux容器)

为了从本地主机访问Windows容器,您需要 指定正在运行的容器的IP地址和端口 服务

您可以通过使用docker inspect和一些 --格式选项和容器的ID或名称。对于上面的示例,使用我们为 容器(Web服务器)而不是容器ID:

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

看来这个问题不像以前那么无聊了。您可以在希望暴露容器端口的主机上指定IP地址

这可能是127.0.0.1,它解决了访问Windows系统上公开的Docker容器端口的问题。运行容器时,只需使用带IP地址的-p开关即可

docker run --rm -it -p 127.0.0.1:3000:3000 ubuntu:latest

我也面临同样的问题,docker run命令的顺序很重要

docker-run-p:
有效

docker-run-p:
不工作

我的设置-

使用Windows 10,版本2004(OS build 19041.329) 启用WSL 2- Ubuntu18.04安装于微软商店,并在docker中启用


谢谢你,凯莉。这很有效。请您将答案中的本地主机IP地址从
172.0.0.1
改为
127.0.0.1
?太好了,我很高兴它对您有用。当然,谢谢你抓住这个:)啊,我花了几个小时试图找出这个。。。谢谢我想这只在Win10中有效,而在Win7中无效:(解决了这个问题,当使用
docker run
时,我在最后使用了-p参数,但它不起作用。重新排列顺序确实起作用。
docker run-p 8081:8081
谢谢。这很有用,但即使有了ip地址。例如172.17.0.2。如何将其用于internet?是否需要将路由器配置为目标不仅仅是192.168.0.2,还有172.17.0.2?