Docker Desktop for Windows:无法在Windows容器模式

时间:2017-05-03 20:52:40

标签: docker docker-for-windows docker-desktop

我正在使用以下 Dockerfiles 在运行 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 .

我用来安装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

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

不确定它是否有帮助但是当我在同一台机器上以Linux container模式运行docker时,我能够访问http://localhost:8080上的jenkins服务器  使用他们的官方码头图像。

4 个答案:

答案 0 :(得分:11)

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

我们正在努力解决此问题,但今天我们建议您通过以下方式解决此问题:

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

答案 1 :(得分:3)

完成@Kallie-Microsoft帖子:

docs.docker.com已使用 Limitations of Windows containers for localhost and published ports

部分进行了更新
  

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

     

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

     

因此,在使用Docker拉取图像并运行图像的场景中   webserver使用如下命令:

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

使用curl http://localhost或指向您的网络浏览器   http://localhost将不会显示nginx网页(就像它一样   使用Linux容器。)

     

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

     

您可以使用docker inspect来获取容器IP地址    - 格式选项以及容器的ID或名称。对于上面的示例,命令看起来像这样,使用我们给的名称   容器(webserver)而不是容器ID:

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

答案 2 :(得分:0)

我遇到了同样的问题,docker run命令的顺序很重要。

docker run -p <host port>:<container port> <image> Works

docker run <image> -p <host port>:<container port> 不起作用

我的设置-

使用Windows 10,2004版(操作系统内部版本19041.329) 已启用WSL 2-{{​​3}} 从Microsoft商店安装了Ubuntu 18.04,并在docker中启用了它。

image

答案 3 :(得分:-1)

看起来这个问题似乎没有以前那么无聊。在https://docs.docker.com/engine/reference/run/#expose-incoming-ports之后的文档中,您可以在要公开容器端口的主机上指定IP地址。

-p=[] : Publish a container's port or a range of ports to the host
               format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
               Both hostPort and containerPort can be specified as a
               range of ports. When specifying ranges for both, the
               number of container ports in the range must match the
               number of host ports in the range, for example:
                   -p 1234-1236:1234-1236/tcp
               When specifying a range for hostPort only, the
               containerPort must not be a range.  In this case, the container port is published somewhere within the specified hostPort range. (e.g., `-p 1234-1236:1234/tcp`)
               (use 'docker port' to see the actual mapping)

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

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