引言
在定义Jenkins CI Pipeline时,我们难免会用到Docker。将复杂Build/Test/Deploy的过程放到容器中,既可以重用环境设置和工具集,也能高效地使用资源。不过我们可能遇到如下场景:
- 在build过程中需要使用Docker命令来启动新的容器或者build新的image
- Jenkins的master或者slave本身就是在容器中运行的
无论哪种情况,本质都是在Docker容器内部运行Docker命令,即所谓的 Docker-In-Docker - DIND场景。本文简单介绍DIND的概念和应用。
概念和原理
Docker In Docker从原理上说实际有两种方式,第一种可以说是伪DIND,也就是Docker的client端在另一个Docker容器中,而server端(docker daemon)还是在宿主机host上。
比如,你在host上启动了一个container(container-with-docker),这个container里面装有Docker CLI,你可以进行docker ps/push/build等操作:
docker run -it container-with-docker sh
接下来在container的sh程序里,你需要执行docker images
命令。直接执行是不行的,因为命令的执行需要与Docker的server端daemon进程通信,container-with-docker这个容器内部并没有这个进程。这就