【Linux】Jenkins连接云服务器Docker失败,全程排查。(注意)

在日常开发中,很多同学会遇到这样的场景:本地虚拟机部署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也无法连接。

配置步骤:

  1. 登录阿里云ECS控制台,找到对应服务器,进入「安全组」配置页面

  2. 点击「添加入方向规则」,按以下配置填写:

    • 授权策略:允许

    • 协议类型:TCP

    • 端口范围:2375/2375

    • 授权对象:你的本机ip(测试用,允许所有IP访问;生产环境建议仅填写本地虚拟机公网IP)

  3. 保存规则,等待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端口了,先部署完再关闭。

三、总结

  1. 安全提醒:开放0\.0\.0\.0:2375端口和安全组授权对象0\.0\.0\.0/0,仅适合测试环境;生产环境建议限制访问IP(仅允许Jenkins所在虚拟机IP),并使用SSH远程部署方案,避免2375端口裸奔带来的安全风险(无认证、无加密,易被攻击)。

  2. 总结:Jenkins连接云服务器Docker失败,核心问题多集中在「Docker远程监听配置」和「网络拦截」。终极办法就是通过开放0.0.0.0:2375端口,解决远程访问问题,配合防火墙、安全组配置,快速实现Jenkins与Docker的远程连接,全程步骤可复现。

(注:文档部分内容由 AI 生成)

相关推荐
cui_ruicheng2 小时前
Linux基础开发工具(一):软件管理与 Vim 编辑器入门
linux·编辑器·vim
同聘云2 小时前
阿里云国际站独立服务器有哪些优点?独立服务器和云服务器的区别
服务器·阿里云·云计算
jaycyj2 小时前
Linux 高级命令
linux
冉佳驹2 小时前
Linux ——— 网络开发核心知识与协议实现详解
linux·http·https·udp·json·tcp·端口号
HalvmånEver2 小时前
MySQL数据库基础入门总结(从0到1)
linux·数据库·mysql
Lugas Luo2 小时前
Kernel 5.10 ATA 驱动分析与车载环境诊断
linux·嵌入式硬件
顶点多余3 小时前
死锁+线程安全
linux·开发语言·c++·系统安全
饺子大魔王的男人3 小时前
Linux 下 Apache RocketMQ 部署与公网访问实现指南
linux·apache·rocketmq
me8323 小时前
【Linux】Docker部署Jenkins
servlet·docker·jenkins