Man*_*ngh 12 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" ]
Run Code Online (Sandbox Code Playgroud)
我从这个docker文件创建图像:
docker build -t windows-java:jre1.8.0_91 .
Run Code Online (Sandbox Code Playgroud)
我用来安装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 .
Run Code Online (Sandbox Code Playgroud)
然后我像这样启动容器:
docker run --name jenkinsci -p 8080:8080 -p 50000:50000 jenkins-windows:2.0
Run Code Online (Sandbox Code Playgroud)
我可以看到容器正常运行并且日志显示良好
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
Run Code Online (Sandbox Code Playgroud)
但是,我无法访问http://localhost:8080
在主机的Web浏览器上运行的jenkins服务器.
不确定它是否有帮助但是当我Linux container
在同一台机器上以模式运行docker时,我能够http://localhost:8080
使用他们的官方docker镜像访问jenkins服务器.
Kal*_*oft 12
这是目前Windows上的一个已知问题.使用localhost/127.0.0.1无法从其自己的主机访问容器端点.今天可以使用Linux容器,因为Docker包含了一个特殊的解决方法,这是他们用于在Windows上运行Linux容器的Moby/Linux实现所特有的.
我们正在努力解决这个问题,但今天我们建议您通过以下方式解决此问题:
docker network inspect <network name>
或docker exec <container ID> ipconfig>
获取容器端点本身的IP地址)要完成@Kallie-Microsoft 帖子:
docs.docker.com 已更新为本地主机和已发布端口的 Windows 容器限制部分
Docker for Windows 提供了切换 Windows 和 Linux 容器的选项。如果您使用的是 Windows 容器,请记住,由于 Windows NAT (WinNAT) 的当前实现,在网络方面存在一些限制。随着 Windows 容器项目的发展,这些限制可能会得到解决。
您可能会立即遇到的一件事是,Windows 容器上的已发布端口不会回环到本地主机。相反,容器端点只能使用容器的 IP 和端口从主机访问。
因此,在使用 Docker 拉取映像并使用如下命令运行网络服务器的场景中:
Run Code Online (Sandbox Code Playgroud)docker run -d -p 80:80 --name webserver nginx
使用 curl http://localhost或将 Web 浏览器指向 http://localhost将不会显示 nginx 网页(就像使用 Linux 容器一样)。
为了从本地主机访问 Windows 容器,您需要为运行服务的容器指定 IP 地址和端口。
您可以通过使用 docker inspect 和一些 --format 选项以及容器的 ID 或名称来获取容器 IP 地址。对于上面的示例,命令看起来像这样,使用我们为容器(网络服务器)提供的名称而不是容器 ID:
Run Code Online (Sandbox Code Playgroud)$ docker inspect \ --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \ webserver
小智 5
这里的问题是“localhost”无法解析为您的容器 IP 地址,因为它不是直接在 Windows 上运行,而是通过 WSL 在 Linux 虚拟机上运行。这是Docker Desktop 的一个已知问题。
您必须做的是将本地端口(在 Windows 上)绑定到 WSL 上的端口。
获取 Linux 虚拟机的 IP 地址(Docker Desktop 在 WSL2 中创建一个名为“docker-desktop”的发行版)
$wsl_ip = (wsl -d "docker-desktop" -- "ifconfig" "eth0" "|" "grep" "inet addr:").trim("").split(":").split()[2]
Run Code Online (Sandbox Code Playgroud)
将本地端口绑定到 Linux 上的同一端口(请参阅Netsh)
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=$wsl_ip
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6989 次 |
最近记录: |