Docker环境下Jenkins Slave无法通过JNLP4连接Master的问题
兄弟,根据你描述的情况——之前正常运行数月,突然Docker容器连不上Jenkins Master,还有一台不受防火墙限制的Docker主机能正常工作,十有八九是防火墙规则变更导致的端口阻塞问题。先给你掰扯清楚那些随机端口的用途,再一步步给你排查方向:
1. 先搞懂那些随机端口的作用
你在成功连接日志里看到的56602、57820这类随机端口,是Jenkins Master和JNLP Slave容器之间建立JNLP4连接时的反向数据通道端口。虽然你已经把JNLP的监听端口固定成了50724,但JNLP4的工作流程是:Slave容器先主动连接Master的固定50724端口完成握手,之后Master会主动发起一个反向连接,用随机端口和Slave建立实际的数据传输通道,这些随机端口就是干这个用的。这也是为什么成功的实例里会出现这类端口。
2. 针对性的防火墙排查步骤
这是当前最优先的排查方向:
- 检查Jenkins Master侧的出站规则:确认Jenkins所在服务器是否允许向Docker主机发起任意端口的出站连接?因为Master需要通过随机端口和Slave容器通信,如果公司防火墙最近限制了Master的出站端口范围,直接就会导致连接被拒。
- 检查Docker主机侧的入站规则:除了已经开放的4243(Docker API端口)和50724(固定JNLP端口),还要确认Docker主机是否允许来自Jenkins Master的**临时端口范围(通常是1024-65535)**的入站请求。或者至少允许Master发起的反向连接通行(有些防火墙可以基于源IP+连接状态放行,比如允许已建立连接的反向流量)。
- 手动验证端口连通性:
- 在Jenkins Master上执行
telnet <Docker主机IP> 50724,确认固定JNLP端口能正常连通; - 找一个成功连接时用过的随机端口(比如56602),在Master上用
nc -zv <Docker主机IP> 56602测试是否能连通,如果不通,基本实锤是防火墙拦截了这类随机端口。
- 在Jenkins Master上执行
3. 快速排除Jenkins配置的小细节
虽然你怀疑是防火墙,但也可以花5分钟快速排除配置问题:
- 确认Jenkins全局配置里的JNLP代理端口确实设置为50724,并且修改后重启过Jenkins生效;
- 检查Yet Another Docker Plugin的配置,容器启动参数里是否正确指定了
-url http://<Jenkins Master IP>:<Master端口>/jenkins,确保Slave容器能正确解析并访问Master地址; - 对比两台Docker主机的容器启动参数,用
docker inspect <容器ID>查看环境变量和启动命令,确认和成功的那台完全一致,避免是配置遗漏导致的问题。
4. 日志与抓包层面的深度验证
如果上面的排查还没找到问题,可以用更技术的方式定位:
- 在Jenkins Master上开启JNLP debug日志:进入
Manage Jenkins → System Log → Add new log recorder,添加hudson.remoting并设置级别为DEBUG,然后重新启动Slave容器,查看详细的连接握手日志,能清楚看到是哪一步被阻塞; - 在Docker主机上抓包分析:执行
tcpdump host <Jenkins Master IP> and (port 50724 or portrange 1024-65535),查看是否有数据包被丢弃,直观判断防火墙是否拦截了流量。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

