Jenkins Agent 优先选择 Docker 容器,适用于大多数构建任务,能显著降低资源占用并加快启动速度。虚拟机仅在需要完整操作系统内核隔离或运行特定系统级服务时作为备选方案。
先说结论:大多数 CI/CD 场景下 Docker 容器更优,虚拟机用于强隔离需求。
- 适合:快速弹性伸缩、环境一致性要求高、轻量级构建任务
- 重点看:宿主机内核兼容性、Docker 权限配置、网络连通性
- 别忽略:容器内构建缓存持久化、大镜像拉取时间、安全隔离边界
命令速用版
在 Jenkins Pipeline 中直接指定 Docker 镜像作为 Agent,无需预先配置静态节点。
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v $HOME/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
sh 'mvn -B'
}
}
}
}上述配置会在构建时自动拉取镜像并启动容器,构建结束后销毁容器。通过 args 参数挂载宿主机目录可保留 Maven 缓存,避免重复下载依赖。
为什么会这样
Docker 容器与虚拟机的核心差异在于虚拟化层级和内核依赖。
Docker 基于操作系统级虚拟化,容器共享宿主机内核,通过命名空间和控制组实现隔离。虚拟机基于硬件级虚拟化,通过 Hypervisor 模拟完整硬件,每个虚拟机运行独立操作系统内核。因此 Docker 容器启动速度通常在秒级,而虚拟机需要加载完整内核,启动时间在分钟级。在资源分配上,Docker 容器进行进程级资源隔离,共享内核资源;虚拟机独立分配 CPU、内存和磁盘,模拟硬件设备,隔离强度更高但开销更大。
分步处理
根据团队需求选择 Agent 类型并按以下步骤配置。
1. 评估场景需求
若构建任务需要快速启停、环境标准化且无需修改内核参数,选择 Docker Agent。若任务需要运行特定操作系统内核模块、需要强安全隔离或运行 Windows 构建环境,选择虚拟机 Agent。
2. 配置 Docker Agent 环境
在运行 Jenkins Agent 的机器上安装 Docker。将 Jenkins Agent 运行用户加入 Docker 用户组,确保无需 sudo 即可执行 docker 命令。配置完成后重启 Jenkins Agent 服务。
3. 配置 Jenkins Docker Cloud
进入 Jenkins 系统管理,找到节点和云管理,新建 Docker Cloud。配置 Docker URL 地址,若使用私有仓库需配置 Registry 凭证。在 Docker Agent 模板中指定镜像标签、工作目录和远程文件系统根目录。
4. 配置虚拟机 Agent
在虚拟化平台创建虚拟机,安装操作系统及 Java 环境。在 Jenkins 中通过 SSH 或 JNLP 方式添加新节点,指定标签以便流水线调度。
怎么验证是否生效
通过构建日志和资源监控确认 Agent 类型及运行状态。
查看 Pipeline 控制台输出,确认是否出现 Docker 容器启动日志及镜像拉取信息。在构建过程中登录宿主机,使用 docker ps 命令检查是否有临时容器运行。监控宿主机 CPU 和内存使用率,对比 Docker 容器与虚拟机在相同负载下的资源占用差异。
常见坑
配置过程中需注意权限、网络和缓存问题。
权限不足:Jenkins 用户未加入 Docker 组会导致构建失败,报错_permission denied_。需检查用户组配置并重启服务。
缓存丢失:容器销毁后内部文件丢失,导致每次构建重新下载依赖。需通过 volume 挂载宿主机目录持久化缓存。
网络不通:容器内无法访问外部网络或 Jenkins Controller。需检查 Docker 网络驱动及防火墙规则,确保容器能连接 Controller 的 50000 端口。
镜像过大:基础镜像体积过大会延长启动时间。建议使用 Alpine 等轻量级镜像,或通过多阶段构建优化镜像大小。
常见问题
Docker Agent 和静态 Agent 有什么区别?
Docker Agent 是动态创建的容器,构建结束后销毁;静态 Agent 是长期运行的物理机或虚拟机节点。
虚拟机 Agent 适合什么场景?
虚拟机 Agent 适合需要完整操作系统内核、强安全隔离或运行非 Linux 系统的构建任务。
如何加速 Docker Agent 构建?
使用轻量级镜像、配置本地镜像仓库、挂载依赖缓存目录可减少构建时间。
Jenkins 运行在 Docker 里能用 Docker Agent 吗?
可以,但需要挂载宿主机 Docker Socket 或使用 Docker-in-Docker 方案,需注意安全风险。
参考来源
- Jenkins Docker Agent 镜像深度解析:从入门到精通
- 「Docker 还是 虚拟机」,一文讲透,让你不再纠结~
- 容器化与虚拟化技术对比:Docker 容器与虚拟机的核心差异解析
- Jenkins 性能优化终极指南:10 个快速提升构建速度和稳定性的技巧
- jenkins 分布式部署`--agent` 放入 Docker
- 23.6k star,devops 工具之 jenkins,为什么建议用 docker 作为 agent
- 一文介绍如何使用 docker 作为 jenkins 的 agent,提高效率、节省资源
- 在流水线中使用 Docker