![image](https://istack.dev59.com/UVtlN.webp)
首先,如果我有这样的设置,我不会费心连接到远程docker,而是在Ubuntu机器上安装Jenkins代理并让它与Jenkins主服务器通信。
但是,如果您想按照当前设置的方式进行操作,即从一个docker主机内部向另一个docker主机进行通信,我建议您查看以下内容:
你的Jenkins主机和Ubuntu机器非常隔离,它们就像在不同的机器上一样,甚至不在同一个房间里。Unix域套接字(以unix://*
标识)是用于在单个本地操作系统内核中通信的,试图将它们桥接到远程机器将导致灾难。
因此,Jenkins与远程主机通信的唯一方式是通过TCP等远程协议。大多数情况下,当您使用默认设置安装Docker时,它根本不会监听TCP,主要是出于安全原因。
首先,您应该配置Ubuntu机器内部的Docker以侦听TCP端口并接受来自远程主机的连接。您可以使用netstat -nat
查看是否有任何内容正在侦听TCP 4243。当正确配置时,您将在nestat输出中看到以0.0.0.0:4243或类似内容开头的行。
其次,您需要确保Ubuntu主机上的防火墙/iptables/netfilter配置允许外部连接。一个好的测试是从Mac终端会话中尝试telnet <ubuntu-ip> 4243
。
然后,您需要确保Docker网络配置正确,以便来自运行Jenkins的容器内部的连接最终到达Ubuntu机器。要进行测试,您需要exec -it
进入Jenkins容器并重复telnet测试。在现代Linux上,通常不安装telnet,因此您可以使用curl -vvv
,它将始终以错误结束,因此只需查看详细输出以查看错误是否是因为无法通信(超时、连接重置等)或错误发生是因为您的curl尝试与docker通信并获得了无意义的响应。在后一种情况下,您可以认为设置正确。
最后,您需要告诉Jenkins Docker通过TCP与远程Docker通信。通常,这是通过命令行给出的,例如docker run、docker ps、docker exec。
我已经通过在我的Jenkins Pipeline中定义从机标签来配置它。 Jenkins代理程序运行在各种不同的环境中,例如物理机器、虚拟机器、Kubernetes集群和Docker镜像。 在您的Jenkins Pipeline或JenkinsFile中,您必须根据您使用的内容设置代理程序,无论是使用Docker镜像还是任何虚拟机。 同时非常感谢@Vlad,你告诉我的所有事情都非常有帮助。