You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins主节点无法通过SSH连接Docker代理节点求助

Jenkins主节点Docker容器无法SSH连接代理节点(超时错误)

我在本地Ubuntu工作站搭建测试用Jenkins环境,主节点以Docker容器运行(版本2.479.2),按以下步骤配置第二个Docker容器作为代理节点,但主节点无法通过SSH连接代理节点,出现连接超时错误。

已执行的配置步骤

  1. 在宿主机生成SSH密钥:ssh-keygen -f jenkins_key
  2. Jenkins网页端创建凭据,配置如下:
设置项值
类型SSH用户名带私钥
作用域全局
IDjenkins
用户名jenkins
私钥直接输入jenkins_key的私钥内容
  1. 创建代理容器命令:
docker run --name jenkins-agent -d --rm -p 4444:22 -e "JENKINS_AGENT_SSH_PUBKEY=<<SSH公钥内容>>" jenkins/ssh-agent

其中<<SSH公钥内容>>是jenkins_key.pub的完整内容,格式类似ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX myuser@computername
4. Jenkins网页端添加新节点,配置如下:

设置项值
节点名称agent1
类型永久代理
远程根目录/home/jenkins
标签agent1
使用方式尽可能使用此节点
启动方式通过SSH启动代理
主机Ubuntu工作站IP(Docker宿主机)
凭据jenkins
主机密钥验证策略手动信任密钥验证策略
高级->端口4444

错误日志

SSHLauncher{host='XXX.XXX.XXX.XXX', port=4444, credentialsId='jenkins', jvmOptions='', javaPath='', prefixStartSlaveCmd='', suffixStartSlaveCmd='', launchTimeoutSeconds=60, maxNumRetries=10, retryWaitTime=15, sshHostKeyVerificationStrategy=hudson.plugins.sshslaves.verifiers.ManuallyTrustedKeyVerificationStrategy, tcpNoDelay=true, trackCredentials=true}
[12/02/24 05:48:28] [SSH] 正在打开到XXX.XXX.XXX.XXX:4444的SSH连接。
连接超时
SSH连接失败,IOException: "连接超时",15秒后重试。剩余10次重试机会。
连接超时
SSH连接失败,IOException: "连接超时",15秒后重试。剩余9次重试机会。
连接超时
SSH连接失败,IOException: "连接超时",15秒后重试。剩余8次重试机会。
连接超时
SSH连接失败,IOException: "连接超时",15秒后重试。剩余7次重试机会。
连接超时
SSH连接失败,IOException: "连接超时",15秒后重试。剩余6次重试机会。
连接超时
SSH连接失败,IOException: "连接超时",15秒后重试。剩余5次重试机会。
连接超时
SSH连接失败,IOException: "连接超时",15秒后重试。剩余4次重试机会。
连接超时
SSH连接失败,IOException: "连接超时",15秒后重试。剩余3次重试机会。
连接超时
SSH连接失败,IOException: "连接超时",15秒后重试。剩余2次重试机会。
连接超时
SSH连接失败,IOException: "连接超时",15秒后重试。剩余1次重试机会。
连接超时
错误:连接未建立!
java.lang.IllegalStateException: 连接未建立!
    at PluginClassLoader for trilead-api//com.trilead.ssh2.Connection.getRemainingAuthMethods(Connection.java:989)
    at PluginClassLoader for ssh-credentials//com.cloudbees.jenkins.plugins.sshcredentials.impl.TrileadSSHPublicKeyAuthenticator.getRemainingAuthMethods(TrileadSSHPublicKeyAuthenticator.java:89)
    at PluginClassLoader for ssh-credentials//com.cloudbees.jenkins.plugins.sshcredentials.impl.TrileadSSHPublicKeyAuthenticator.canAuthenticate(TrileadSSHPublicKeyAuthenticator.java:81)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(Unknown Source)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(Unknown Source)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
    at java.base/java.util.Spliterators$IteratorSpliterator.tryAdvance(Unknown Source)
    at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(Unknown Source)
    at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(Unknown Source)
    at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
    at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(Unknown Source)
    at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
    at java.base/java.util.stream.ReferencePipeline.findFirst(Unknown Source)
    at PluginClassLoader for ssh-credentials//com.cloudbees.jenkins.plugins.sshcredentials.SSHAuthenticator.newInstance(SSHAuthenticator.java:222)
    at PluginClassLoader for ssh-credentials//com.cloudbees.jenkins.plugins.sshcredentials.SSHAuthenticator.newInstance(SSHAuthenticator.java:173)
    at PluginClassLoader for ssh-slaves//hudson.plugins.sshslaves.SSHLauncher.openConnection(SSHLauncher.java:882)
    at PluginClassLoader for ssh-slaves//hudson.plugins.sshslaves.SSHLauncher.lambda$launch$0(SSHLauncher.java:441)
    at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)

排查与解决步骤

1. 验证端口映射是否生效

在宿主机执行以下命令,检查4444端口是否被jenkins-agent容器监听:

sudo netstat -tulpn | grep 4444

如果无输出,说明容器启动失败或端口映射错误,查看容器日志:

docker logs jenkins-agent

2. 测试宿主机到代理容器的SSH连通性

在宿主机直接尝试SSH连接代理容器,确认端口和密钥正常:

ssh -i jenkins_key jenkins@localhost -p 4444

若连接失败,检查公钥是否正确传入容器:

docker exec -it jenkins-agent cat /home/jenkins/.ssh/authorized_keys

确认内容与jenkins_key.pub完全一致,无多余空格或换行。

3. 检查Jenkins主容器的网络访问权限

主节点为Docker容器,访问宿主机IP可能受网络模式影响:

  • 若主容器用默认bridge网络,尝试将代理节点的主机地址改为host.docker.internal(Docker内置宿主机别名),或启动主容器时添加--network host参数(共享宿主机网络)。
  • 测试主容器内部能否访问宿主机4444端口:
docker exec -it <jenkins主容器名称> bash
apt update && apt install -y telnet
telnet <宿主机IP> 4444

若telnet超时,说明主容器无法访问宿主机4444端口,需调整网络配置。

4. 确认防火墙设置

检查Ubuntu宿主机UFW防火墙是否允许4444端口入站:

sudo ufw status

若未开放,执行:

sudo ufw allow 4444/tcp

5. 调整SSH启动超时时间

在Jenkins节点配置的高级选项中,将Launch timeout seconds从60调整为120,避免容器启动慢导致超时。

内容的提问来源于stack exchange,提问作者Glen Hughes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:56:05