我正在使用以下 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服务器
使用他们的官方码头图像。
答案 0 :(得分:11)
这是Windows上目前已知的问题。使用localhost / 127.0.0.1无法从其自己的主机访问容器端点。今天可以使用Linux容器,因为Docker包含了一个特殊的解决方法,这是他们用于在Windows上运行Linux容器的Moby / Linux实现所特有的。
我们正在努力解决此问题,但今天我们建议您通过以下方式解决此问题:
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中启用了它。
答案 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