在Docker部署的Jenkins中运行Selenoid时连接被拒绝问题求助
问题排查与解决方案
核心原因
Jenkins运行在Docker容器内,容器内的localhost指向Jenkins容器自身,而非宿主机。虽然Selenoid容器已将4444端口映射到宿主机,但Jenkins容器无法通过localhost访问宿主机的端口,导致连接被拒绝。
解决方案
方案1:使用自定义Docker网络(推荐)
通过将Jenkins和Selenoid容器加入同一自定义网络,实现容器间直接通信:
- 创建自定义网络:
docker network create jenkins-selenoid - 重启Jenkins容器并加入该网络(修改原启动命令,添加
--network jenkins-selenoid参数) - 修改Pipeline脚本,启动Selenoid时指定网络:
pipeline { agent any stages { stage('Prepare Selenoid') { steps { sh 'wget "https://github.com/aerokube/cm/releases/download/1.8.2/cm_linux_amd64"' sh 'chmod +x cm_linux_amd64' // 添加--network参数指定自定义网络 sh './cm_linux_amd64 selenoid start --vnc --network jenkins-selenoid' sh 'docker ps' sh 'docker logs selenoid' // 使用Selenoid容器名访问,而非localhost sh 'curl http://selenoid:4444/status' } } } post { always { script { sh 'docker stop selenoid' sh 'docker rm selenoid' } } } }
方案2:让Jenkins容器使用宿主机网络
启动Jenkins容器时添加--network host参数,使容器直接使用宿主机网络栈,此时容器内的localhost等同于宿主机:
docker run -d --network host ... jenkins/jenkins:lts
此方式无需修改Pipeline脚本,直接使用原curl http://localhost:4444/status即可,但会牺牲容器网络隔离性,不建议在生产环境使用。
方案3:使用宿主机IP访问
找到宿主机的实际IP地址(如192.168.1.100),修改Pipeline中的curl命令:
sh 'curl http://192.168.1.100:4444/status'
此方式需确保宿主机IP稳定,否则需频繁修改脚本,灵活性较差。
额外验证点
确认Jenkins容器已正确挂载Docker套接字(启动命令包含-v /var/run/docker.sock:/var/run/docker.sock),否则Pipeline中的docker命令无法正常执行。
内容的提问来源于stack exchange,提问作者Sundel
相关产品推荐
相关产品推荐

