docker-in-docker(dind)服务在gitlab ci

时间:2017-11-14 08:28:29

标签: docker continuous-integration gitlab gitlab-ci

根据官方gitlab documentation,在docker build管道中启用ci的一种方法是使用dind服务(就{{1}而言) } services)。

但是,由于在docker执行程序上运行ci作业总是如此,因此还需要gitlab-ci图像。

有人可以解释一下:

  • docker:latestdocker:dind图片之间有什么区别?
  • (最重要的):为什么 两者所需的服务和泊坞窗图片(例如,从github文档中链接到的in this example所示)到执行例如一个docker:latest在一个ci工作?并不是docker build图像(将在其中执行作业!)包含docker守护程序(我认为docker:latest也是),这些是工具我们需要的命令是必要的(例如docker-composedocker build等)?

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

  

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

2 个答案:

答案 0 :(得分:30)

  

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

  • docker:latest包含连接到docker守护程序所需的所有内容,即运行docker builddocker run等。它还包含docker守护程序,但它不是作为入口点启动的。
  • docker:dind构建于docker:latest并启动docker守护程序作为其入口点。

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

  

为什么服务和泊坞窗图像都需要[...]?

你不需要两者。你可以使用两者中的任何一个,作为第一步启动dockerd,然后像往常一样运行docker builddocker run命令here;显然这是gitlab at some point中的原始方法。但我发现只写service: docker:dind而不是before_script设置dockerd更清楚。此外,你不必弄清楚如何开始&在基本映像中正确安装dockerd(如果您没有使用docker:latest。)

如果您知道您的跑步者正在将.gitlab-ci.yml加载到您的图片中,您还可以轻松地在/var/run/docker.sock中声明该服务,从而轻松更换docker-in-docker。您可以将protected variable DOCKER_HOST设置为unix:///var/run/docker.sock以获得更快的构建。其他无法访问此类跑步者的人仍然可以分配您的存储库并回退到dind服务,而无需修改您的.giltab-ci.yml

答案 1 :(得分:-2)

容器将仅包含docker镜像中定义的内容。你知道你可以从基本图像开始安装任何东西。 但是你也可以在一个容器中安装Docker(deamon和client),也就是说Docker IN Docker(dind)。因此容器将能够运行其他容器。这就是为什么gitlab需要这个。