基于Docker容器化部署Jenkins主节点与弹性工作节点实践
一、容器化部署Jenkins主控服务
采用阿里云镜像源快速搭建Docker运行环境,并拉取指定版本的Jenkins长期支持版镜像:
# 配置Docker软件源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum clean all && yum makecache fast
yum install -y docker-ce
# 获取Jenkins镜像(JDK11版本)
docker pull jenkins/jenkins:2.375.1-lts-jdk11
# 创建持久化数据目录并设置权限(容器内jenkins用户UID为1000)
mkdir -p /data/jenkins_home
chown -R 1000:1000 /data/jenkins_home
# 启动主控容器
docker run -d --name jenkins-controller \
--privileged \
-p 8080:8080 \
-p 50000:50000 \
-v /etc/localtime:/etc/localtime:ro \
-v /data/jenkins_home:/var/jenkins_home \
jenkins/jenkins:2.375.1-lts-jdk11
50000端口用于JNLP协议通信,供工作节点与主控建立连接。初始化完成后通过以下命令获取管理员密钥:
docker exec jenkins-controller cat /var/jenkins_home/secrets/initialAdminPassword
访问http://<服务器IP>:8080完成向导配置,推荐安装推荐插件集。
二、静态工作节点接入方案
1. 主控端节点注册
进入系统管理 → 节点管理 → 新建节点,选择"永久代理"类型,填写节点标识名称。
2. 节点参数配置
关键配置项说明:
- 远程工作目录:/home/jenkins/agent
- 启动方式:通过Java Web启动代理(JNLP)
- 可用性:尽可能保持在线
3. 获取连接凭证
保存节点配置后,进入节点详情页查看JNLP启动参数,记录以下信息:
- 主控访问地址(如:
http://192.168.1.100:8080/) - 节点密钥(Secret)
- 节点名称(Agent Name)
4. 工作节点容器启动
在目标服务器部署JNLP代理容器:
# 拉取与主控JDK版本兼容的代理镜像
docker pull jenkins/inbound-agent:jdk11
# 启动代理容器(示例参数需替换为实际值)
docker run -d --name static-agent-01 \
--privileged \
-v /etc/localtime:/etc/localtime:ro \
jenkins/inbound-agent:jdk11 \
-url http://192.168.1.100:8080/ \
<节点密钥> \
<节点名称>
# 查看连接日志
docker logs -f static-agent-01
状态显示为在线即表示接入成功。
三、动态工作节点弹性伸缩方案
1. Docker服务端配置
启用Docker远程API(工作节点服务器执行):
# 修改服务配置文件
vim /usr/lib/systemd/system/docker.service
# 在ExecStart后追加:-H tcp://0.0.0.0:2376
# 重载并验证
systemctl daemon-reload
systemctl restart docker
curl http://127.0.0.1:2376/version
2. 准备构建环境镜像
定制包含JDK、Maven、Git的基础构建镜像(确保JDK版本≥主控):
docker pull harbor.example.com/builder/jdk11-maven-git:v1.0
3. 方案一:Cloud方式配置
步骤1:安装插件
在插件管理中搜索并安装 Docker 插件。
步骤2:配置云服务商
进入系统管理 → Clouds → 新建,选择Docker类型:
- Docker Host URI:
tcp://192.168.1.133:2376 - 凭证:如启用TLS则配置证书,否则留空
步骤3:定义容器模板
- 标签:docker-elastic
- Docker镜像:harbor.example.com/builder/jdk11-maven-git:v1.0
- 远程文件系统根目录:/home/jenkins
- 启动方式:连接到JNLP主控
- JNLP隧道:主控IP:50000(如跨网络需配置)
步骤4:流水线验证
pipeline {
agent {
label 'docker-elastic'
}
stages {
stage('环境检查') {
steps {
sh 'java -version'
sh 'mvn -v'
sh 'git --version'
}
}
}
}
触发构建后,系统将自动拉取镜像创建容器,任务结束后自动销毁。
4. 方案二:声明式直接调用
在Pipeline中直接使用dockerNode步骤动态申请资源:
dockerNode(
dockerHost: 'tcp://192.168.1.133:2376',
image: 'harbor.example.com/builder/jdk11-maven-git:v1.0',
remoteFs: '/home/jenkins'
) {
stage('构建') {
sh 'java -version'
sh 'mvn clean package -DskipTests'
}
}
此方式无需预先配置Cloud,适合临时性构建需求或脚本化场景。
四、关键注意事项
| 项目 | 说明 |
|---|---|
| JDK版本对齐 | 工作节点JDK版本不得低于主控,建议统一使用JDK11或JDK17 |
| 权限配置 | 自定义镜像建议以root运行,避免挂载卷权限问题 |
| 网络连通 | 确保工作节点能访问主控的8080(Web)和50000(JNLP)端口 |
| 镜像预热 | 动态节点首次启动需拉取镜像,建议在非高峰时段预拉取 |
