Jenkins容器agent是如何在没有docker的情况下依然可以运行docker命令的?

为什么我的Jenkins容器agent可以在容器内并没有docker的情况下,在流水线内依然可以运行docker? jenkins是如何做到的?

本来是我一直把docker以及docker.sock挂载到容器中去的,今天突发奇想去掉了挂载,发现依然可以执行,真的很神奇。

这AI的回答没太看懂,什么叫容器里即便没有docker,但jenkins代理安装了docker, jenkins agent不是运行在这个临时run起来的容器中的么。

我使用docker agent templet来执行job。
image.png

这里是我在一个流水线的执行过程中,进入到容器里,可以看到容器里是没有docker的。
image.png
但神奇的是,流水线中代码的 sh'docker xxxx' ,是可以执行的。
image.png

同时还有一点神奇的,在同一个jenkins集群内,我为多个docker host都配置了同样的agent templet,区别是lable不同,当我调度docker host为其他主机的label, 流水线里执行sh'docker info' ,可以观察到,无论容器最终在哪个docker host上执行,流水线内通过docker info可以看到,docker.sock都是指向同一台主机的。

阅读 582
avatarAI BotBETA

首先,让我们了解一下Jenkins和Docker的基础知识。

Jenkins是一个持续集成/持续部署工具,它支持在多个容器中运行任务。这些容器可以用于执行各种任务,包括构建、测试和部署应用程序。Jenkins通过使用代理(agent)来管理和监控这些容器。

Docker是一个开源平台,用于打包、分发和运行应用程序。它使用容器化技术来打包应用程序及其所有依赖项,并使其易于部署和扩展。

在您的情况下,即使容器中没有安装Docker,Jenkins仍然能够在流水线中执行Docker命令。这是通过在Jenkins代理上安装Docker命令行工具实现的。Docker命令行工具是一个可执行文件,可以在没有安装Docker的情况下执行Docker命令。

当您在流水线中执行sh'docker xxxx'时,Jenkins代理将在其上执行该命令。由于Jenkins代理上已经安装了Docker命令行工具,因此它可以执行这些Docker命令,而无需在容器中安装Docker本身。

至于您提到的docker.sock指向同一台主机的问题,这可能是因为Jenkins代理在所有容器中共享了相同的Docker守护进程。当您在流水线中执行Docker命令时,这些命令实际上是在Jenkins代理上执行的,而不是在容器本身上执行的。因此,无论容器在哪个Docker主机上执行,Docker命令都会通过Jenkins代理进行中转,并使用共享的Docker守护进程来执行。

总结一下,Jenkins能够在没有安装Docker的情况下执行Docker命令,是通过在Jenkins代理上安装Docker命令行工具实现的。而无论容器在哪个Docker主机上执行,Docker命令都会通过Jenkins代理进行中转,并使用共享的Docker守护进程来执行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题