17

我正在使用以下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主机的 Web 浏览器上运行的 jenkins 服务器。

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

4

5 回答 5

15

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

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

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

要完成@Kallie-Microsoft 帖子:

docs.docker.com 已更新为 localhost 和已发布端口的 Windows 容器限制部分


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

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

因此,在您使用 Docker 拉取映像并使用以下命令运行网络服务器的场景中:

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

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

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

您可以使用带有一些 --format 选项的 docker inspect 和容器的 ID 或名称来获取容器 IP 地址。对于上面的示例,命令看起来像这样,使用我们给容器(网络服务器)的名称而不是容器 ID:

$ docker inspect \
  --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
  webserver
于 2017-08-30T16:39:39.040 回答
2

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

docker run -p <host port>:<container port> <image> 作品

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

我的设置 -

使用 Windows 10 版本 2004(操作系统版本 19041.329)启用 WSL 2 - https://docs.microsoft.com/en-us/windows/wsl/wsl2-index 从 Microsoft 商店安装的 Ubuntu 18.04 并在 docker 中启用。

图片

于 2020-06-23T08:54:32.300 回答
1

这里的问题是“localhost”无法解析到您的容器 IP 地址,因为它不是直接在 Windows 上运行,而是通过 WSL 在 Linux 虚拟机上运行。这是Docker Desktop 的一个已知问题

您必须做的是将本地端口(在 Windows 上)绑定到 WSL 上的端口。

在 Windows 终端/Powershell 中:

获取 Linux 虚拟机的 IP 地址(Docker Desktop 在 WSL2 中创建了一个名为“docker-desktop”的发行版)

$wsl_ip = (wsl -d "docker-desktop" -- "ifconfig" "eth0" "|" "grep" "inet addr:").trim("").split(":").split()[2]

将本地端口绑定到 Linux 上的同一端口(请参阅Netsh

netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=$wsl_ip
于 2022-01-26T21:33:30.857 回答
-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 容器端口的问题。运行容器时只需使用带有 IP 地址的 -p 开关。

docker run --rm -it -p 127.0.0.1:3000:3000 ubuntu:latest
于 2020-01-30T07:16:07.450 回答