Jenkins集成Docker的三种方式(Docker Desktop),万字长文!

本文详细介绍了将Docker与Jenkins集成的三种方法:Docker Shell、Docker as Agent和Docker out of Docker (DooD)。通过Docker Shell直接在脚本中调用Docker命令,Docker as Agent将Docker配置为Jenkins代理节点,以及Docker out of Docker在Jenkins容器中运行Docker。每种方法的配置步骤、优缺点及适用场景均有详尽阐述,帮助读者选择最适合的集成策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


文章有些长,可以先直接到最后一步四、Jenkins + Docker集成方式对比总结 看对比总结

对于Jenkins,有3种方式可以把Docker集成到Pipeline中(括号的方式是我自己起的,只是一个称号,不那么标准不要介意)

  • 直接在脚本中通过Shell调用 (Docker Shell)
  • 把Docker配置成一个云,作为一个单独的Jenkins代理节点使用 (Docker as Agent
  • Docker运行Jenkins实例容器,在该容器中装Docker,映射Docker命令 (Docker out of Docker, DooD)

一、直接在脚本中通过shell调用 (Docker Shell)

前提是你的运行节点上安装了Docker,且加入了PATH变量中,这里是Pipeline脚本,比如我的master节点中装了Docker(正确的做法是master节点不运行任何项目,这里只用于示意)

node('master'){
   
	 stage('test'){
   			
			if(isUnix()){
   
				shell "docker run --name python python:3.10-rc-slim /bin/sh -c 'ls'"
			} else {
   
	        	bat "docker run --name python python:3.10-rc-slim /bin/sh -c 'ls'"
			}
	 }
}

输出效果
在这里插入图片描述
这种方式最简单,也很好掌握,只不过我们需要在一句话命令中需要想好所有要执行的操作,并且注意不要忘记手动检查和销毁容器。后面的两种集成方式就有些难度了,下面好戏开场

二、把Docker配置成一个云,作为一个单独的Jenkins代理节点使用 (Docker as Agent)

手画的示意图如下
在这里插入图片描述
这种方式集成Docker的优缺点

  • 优点:
    • Jenkns master可以部署在任意平台(Windows, Mac ,Docker…)

    • Docker服务不受具体代理节点的限制 。Docker服务可以在Jenkins能够访问的任意一台机器上,而不是一定非要在依托于代理节点, 举个例子,我的电脑(Winodws)有Docker Desktop,同时Jenkins能够访问到该Docker, 那么就可以通过这个Docker服务创建Docker容器当作Jenkins的代理节点,而事实上我的电脑(Windows系统)并没有作为Jenkins的代理节点

    • 支持所有类型的项目。 无论是Freestyle风格,还是Pipline风格,都可以直接用Docker代理节点

  • 缺点:
    • 配置过程比较繁琐
    • Docker代理节点镜像受限制,必须基于官方提供Jenkins代理节点镜像

这里有两种方式将Docker容器视为代理节点

  • 将Docker容器当作持久代理节点
  • 将Docker容器挡住临时代理节点

开始介绍每种方式的配置方式

1. 配置持久的Docker代理节点

1.1. Jenkins和Docker配置

首先我们看一下示意图, 一个Jenkins的Docker子节点需要对应一个运行中的Docker容器

  • Docker Desktop设置
  • Docker镜像选择
  • Docker节点配置
  • Docker容器启动方式

在这里插入图片描述

1.1.1. Docker Desktop设置

Docker Desktop 启用 tcp://localhost:2375 端口,这样允许Docker与Jenkins进行交互

在这里插入图片描述
测试 2375端口是否可用, 转到Powershell, 测试2375端口

Test-NetConnection -ComputerName localhost -Port 2375

若成功则如下图所示
在这里插入图片描述
否则失败说明2375端口被占用,解决方法可以参考这个issue https://github.com/docker/for-win/issues/3633

1.1.2. 配置Docker代理节点

上一步中我们已经通过Jenkins可以访问具体的Docker服务,这时可以新建Docker代理节点, 如图所示以下参数非常重要

  • 节点名称 - docker容器启动时需要用到这个参数 , 例如为 node_docker_1
  • 节点根目录 - Pipeline脚本中会用到,默认的Jenkins的Job的工作目录, 这里必须填写 /home/jenkins/agent/,因为Jenkins官方的子节点镜像中默认该位置为工作目录(目录已创建),如果是其他目录则有可能为空,导致Jenkins运行Job时失败
  • 节点标签 - Pipline脚本中会用到,指定某个节点运行,例如为 label_node_docker_1
  • 连接方式 - 必须选用"Launch agent by connecting it to the master",因为Jenkins官方的子节点镜像默认这种连接方式

在这里插入图片描述
在未连接的情况下我们可以看到Jenkins有提示我们该如何连接至这个节点,事实上因为Jenkins官方提供的Jenkins子节点镜像中已经做了此项工作,我们只需记住这一步中的secret即可

  • secret - 一串加密字符串
    在这里插入图片描述
1.1.3. Docker镜像选择

Jenkins官方已经提供了 docker代理节点的镜像, jenkins/inbound-agent, 使用以下命令下载该镜像

docker pull jenkins/inbound-agent

如果你想使用自己的镜像,则必须在在此基础镜像构建,下载相关依赖, 例如下面的Dockerfile

FORM jenkins/inbound-agent

# 
RUN xxx....
1.1.4. Docker容器启动方式

这里以官方的镜像jenkins/inbound-agent为例, 启动容器的方式如下(当然你也可以参考官方文档 https://hub.docker.com/r/jenkins/inbound-agent/)

docker run --name jenkins_agent_container --init jenkins/inbound-agent -url <http://jenkins-server:port> <secret> <agent name>

这里有三个参数需要更改, 也就是第2步中的参数

  • <http://jenkins-server:port> - Jenkins地址例如 http://xxxx:8080/
  • <secret> - 一串加密字符串,在2步中已经获取到了
  • <agent name> - 代理的子节点名称, 在2步中已经配置

例如这里我们将这个容器实例命名为jenkins_agnet_container , 启动后查看相关信息 , 可以看到已经连接至我们的jenkins的docker节点, 此时Jenkins的docker节点也显示正常

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值