docker-in-docker(dind)服务在gitlab ci中的作用

pka*_*mol 37 continuous-integration gitlab docker gitlab-ci

根据官方gitlab文档,docker buildci管道内启用的一种方法是使用dind服务(就gitlab-ci 服务而言).

但是,由于在docker执行程序上运行ci作业总是如此,因此docker:latest也需要图像.

有人能解释一下:

  • docker:dinddocker:latest图像有什么区别?
  • (最重要的):为什么这两个服务和所需要的泊坞窗图像(如所示在这个例子中,从GitHub的文档链接)来执行如docker buildwhithin一个CI的工作吗?不是docker:latest图像(作业将在其中执行!)包含docker守护程序(我认为docker-compose也是),它们是我们需要的命令所必需的工具(例如docker build,docker push等等)?

除非我错了,否则问题或多或少变成:

为什么docker客户端和docker守护程序不能驻留在同一个docker(启用)容器中

小智 44

docker:dind和docker:最新图片有什么区别?

  • docker:latest包含需要连接到一个码头工人守护进程,即一切,运行docker build,docker run和这样的.它还包含docker守护程序,但它不是作为入口点启动的.
  • docker:dind构建docker:latest并启动docker守护进程作为其入口点.

因此,它们的内容几乎相同,但是通过它们的入口点,一个被配置为连接到tcp://docker:2375客户端而另一个用于守护进程.

为什么需要服务和码头图像[...]?

你不需要两者.你可以使用二者中的任何,开始dockerd作为第一步,然后再运行docker build,并docker run命令像往常一样,像我一样在这里 ; 显然这是gitlab 在某些时候的原始方法.但我发现只写service: docker:dind而不是before_script设置更清洁dockerd.此外,您不必弄清楚如何dockerd在基本映像中正确启动和安装(如果您不使用docker:latest.)

.gitlab-ci.yml如果您知道您的跑步者正在将其添加/var/run/docker.sock到您的图像中,则可以轻松地在您的服务中声明该服务.您可以将受保护变量 DOCKER_HOST设置unix:///var/run/docker.sock为更快的构建.其他无法访问此类跑步者的人仍然可以分叉您的存储库并回退到dind服务而无需修改您的.gitlab-ci.yml.

  • 感谢您的精彩解释!后续问题,如果唯一的区别是 docker:dind 已启动 docker 守护进程作为入口点,为什么我们不能直接使用 docker:dind 作为镜像?是因为在`docker:dind`中,它也被配置为连接到`tcp://docker:2375`而不是`tcp://localhost:2375`? (2认同)