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

在Docker部署的Jenkins中运行Selenoid时连接被拒绝问题求助

问题排查与解决方案

核心原因

Jenkins运行在Docker容器内,容器内的localhost指向Jenkins容器自身,而非宿主机。虽然Selenoid容器已将4444端口映射到宿主机,但Jenkins容器无法通过localhost访问宿主机的端口,导致连接被拒绝。

解决方案

方案1:使用自定义Docker网络(推荐)

通过将Jenkins和Selenoid容器加入同一自定义网络,实现容器间直接通信:

  1. 创建自定义网络:
    docker network create jenkins-selenoid
    
  2. 重启Jenkins容器并加入该网络(修改原启动命令,添加--network jenkins-selenoid参数)
  3. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:35:35