在日常开发中,很多同学会遇到这样的场景:本地虚拟机部署Jenkins,想通过Docker远程API(2375端口)连接云服务器Docker,实现自动化构建部署,但反复出现Connection refused连接拒绝错误,排查许久仍无法解决。本文结合本人实际踩坑经历,从问题现象、全程排查过程,到最终解决方案,完整梳理整个流程,适合新手直接参考复现,避开所有常见坑。
一、问题场景与核心报错
1. 环境配置
-
本地环境:虚拟机(CentOS/Anolis OS),Docker容器运行Jenkins,通过docker-maven-plugin插件尝试远程连接云服务器Docker
-
云服务器环境:Anolis OS 8.6,已安装Docker,计划开放2375端口供Jenkins远程访问
-
核心需求:Jenkins拉取代码、打包后,通过2375端口远程调用云服务器Docker,完成镜像构建与项目部署
2. 核心报错
Jenkins执行构建任务时,频繁抛出以下错误,导致构建失败:

报错分析:连接拒绝是核心问题,镜像拉取失败是连接失败的衍生问题------Jenkins无法连接云服务器Docker,自然无法拉取镜像完成构建。
二、全程排查步骤
排查核心思路:先确认云服务器Docker本身是否正常,再排查Docker远程监听配置,最后排查网络拦截(防火墙、安全组),逐步定位问题根源。
第一步:排查云服务器Docker服务是否正常运行
Docker服务是基础,若服务未正常启动,后续所有配置都无效。登录云服务器,执行以下命令:
bash
# 查看Docker服务运行状态
systemctl status docker
结果判断:
-
✅ 正常:输出显示
active \(running\)(绿色),说明Docker服务运行正常,进入下一步排查 -

-
❌ 异常:输出显示
failed(红色),说明Docker启动失败,大概率是配置冲突(Anolis OS 8专属坑,后续重点解决)
第二步:排查Docker是否开启2375远程监听
Jenkins通过2375端口连接Docker,核心是Docker必须开启该端口的远程监听。执行以下命令,检查监听状态:
bash
# 查看2375端口监听情况,确认是否由dockerd进程监听
ss -lntp | grep 2375
# 查看Docker配置文件,确认是否配置了远程监听
cat /etc/docker/daemon.json
常见问题与解决:
-
❌ 无任何输出(未监听2375端口):需手动配置Docker开启远程监听,编辑
/etc/docker/daemon\.json,添加监听配置(下文详细说明) -
❌ 监听地址为
127\.0\.0\.1:2375:仅允许云服务器本地访问,远程(Jenkins)无法连接,需修改为0\.0\.0\.0:2375(核心解决点) -
✅ 监听地址为
0\.0\.0\.0:2375:说明监听配置正常,进入下一步排查

第三步:解决Docker启动冲突(答主上面测试有监听,所以这第三步并没有去执行)
很多同学配置完daemon\.json后,Docker启动失败,核心原因是:Anolis OS 8/CentOS 8的Docker默认服务配置(docker\.service)中,自带\-H fd://参数,与daemon\.json中的hosts配置冲突,导致Docker无法启动。
解决方案(直接复制执行,一步到位):
bash
# 1. 编辑Docker配置文件,添加0.0.0.0:2375监听
vi /etc/docker/daemon.json
配置内容(保留镜像加速,重点添加hosts配置):
json
{
"default-address-pools": [
{
"base": "10.255.0.0/16",
"size": 24
}
],
"registry-mirrors": [
"https://mirrors-ssl.aliyuncs.com/"
],
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
关键说明:tcp://0\.0\.0\.0:2375 表示监听云服务器所有网卡的2375端口,允许任何远程IP(包括本地Jenkins)访问,这是后续解决连接问题的核心配置。
继续执行命令,解决启动冲突:
bash
# 2. 编辑Docker服务文件,删除冲突的-H fd://参数
sed -i 's/^ExecStart=\/usr\/bin\/dockerd.*$/ExecStart=\/usr\/bin\/dockerd --containerd=\/run\/containerd\/containerd.sock/' /usr/lib/systemd/system/docker.service
# 3. 重载系统配置,重启Docker
systemctl daemon-reload
systemctl restart docker
# 4. 再次验证监听状态
ss -lntp | grep 2375
✅ 验证成功:输出显示0\.0\.0\.0:2375,且进程为dockerd,说明Docker已正常监听2375端口。
第四步:排查网络拦截(答主在这一步解决的)(防火墙+云服务器安全组)
Docker已正常监听2375端口,但Jenkins仍连接拒绝,大概率是网络拦截------云服务器的系统防火墙或阿里云安全组未开放2375端口。
1. 排查云服务器系统防火墙
bash
# 查看已放通的端口
firewall-cmd --list-ports
# 若未显示2375/tcp,执行以下命令开放端口
firewall-cmd --add-port=2375/tcp --permanent
firewall-cmd --reload
# 测试用可直接关闭防火墙(快速验证)
systemctl stop firewalld
systemctl disable firewalld
2. 排查阿里云ECS安全组
云服务器的安全组是独立于系统防火墙的网络拦截规则,即使关闭系统防火墙,安全组未开放端口,Jenkins也无法连接。
配置步骤:
-
登录阿里云ECS控制台,找到对应服务器,进入「安全组」配置页面
-
点击「添加入方向规则」,按以下配置填写:
-
授权策略:允许
-
协议类型:TCP
-
端口范围:
2375/2375 -
授权对象:
你的本机ip(测试用,允许所有IP访问;生产环境建议仅填写本地虚拟机公网IP)
-
-
保存规则,等待1-2分钟(安全组规则生效有短暂延迟)

关键避坑:
别把「内网 IP」当成「公网 IP」
很多人会踩这个致命错误:
你虚拟机里 ip addr 看到的 192.168.x.x、10.x.x.x 是内网 IP,只能在局域网内使用,绝对不能填到阿里云安全组!
只有上面命令查出来的、能在互联网上路由的 IP,才是公网出口 IP,是阿里云安全组唯一需要放行的 IP。
要正确获取自己本机真正的ip,
bash
curl ifconfig.me
很多情况

第五步:验证连通性
完成以上配置后,回到本地虚拟机,执行以下命令,验证2375端口是否连通:
bash
# 测试端口连通性
curl -v telnet://云服务器ip:2375
# 验证Docker API是否可用(核心验证)
curl http://云服务器ip:2375/version
结果判断:
-
✅ 成功:显示
Connected to 47\.106\.72\.70 port 2375,且能返回Docker版本信息,说明连接正常 -
❌ 失败:重新检查上述配置,重点确认0.0.0.0:2375监听和安全组规则

第六步:解决镜像拉取衍生问题(我的项目有涉及到这个,如果没有此类问题的不必看了)
连接成功后,若Jenkins仍报错pull access denied(镜像拉取权限不足),无需复杂的仓库认证配置,直接替换为Docker Hub公共镜像(如openjdk:8),修改项目Dockerfile即可:
dockerfile
# 注释掉需要认证的私有镜像
# FROM hangzhou.personal.cr.aliyuncs.com/01xq/openjdk:8
# 替换为公共镜像,无需登录即可拉取
FROM openjdk:8
替换后,Jenkins可正常拉取镜像,完成后续构建部署。
三、终极解决方案:开放0.0.0.0端口(核心关键)
若经过多轮排查,还是无法解决,那么就只能开放未开放0.0.0.0端口了,先部署完再关闭。
三、总结
-
安全提醒:开放
0\.0\.0\.0:2375端口和安全组授权对象0\.0\.0\.0/0,仅适合测试环境;生产环境建议限制访问IP(仅允许Jenkins所在虚拟机IP),并使用SSH远程部署方案,避免2375端口裸奔带来的安全风险(无认证、无加密,易被攻击)。 -
总结:Jenkins连接云服务器Docker失败,核心问题多集中在「Docker远程监听配置」和「网络拦截」。终极办法就是通过开放0.0.0.0:2375端口,解决远程访问问题,配合防火墙、安全组配置,快速实现Jenkins与Docker的远程连接,全程步骤可复现。
(注:文档部分内容由 AI 生成)