docker 执行者 vs docker dind 图像

docker executor vs docker dind image

我是gitlabci的新手。我想了解为什么我们需要 docker dind 图像才能在 GitLab CI 作业中构建 docker 图像。为什么我们不能在脚本下使用docker执行器和运行docker命令?

当我们注册docker executor gitlab 运行ner时,我们选择一张图片.. 再次在 gitlabci 中,我们在 image:services: 字段下选择一个图像。那么这是否意味着 docker 执行器容器中的这个 GitLab CI 作业容器 运行s?

why do we need docker dind image in order to build a docker image in GitLab CI jobs. Why can't we use the docker executor and run docker commands under scripts?

这部分取决于您如何配置 GitLab 运行ner。

为什么 docker 在容器内不起作用

当您调用 docker 命令时,它们实际上是在与 docker 守护进程 对话,这是执行构建和执行其他 docker 命令。通常,docker 执行程序下的作业 运行ning 默认情况下无权访问任何 docker 守护进程。如果您尝试在本地启动的 docker 容器中 运行 docker,您将面临同样的问题。

即使我可以 运行 docker 在我的主机上成功:

$ docker run --rm docker /bin/sh -c 'hello from container $HOSTNAME'
hello from container 2b51479b11b1

我不能运行docker进入容器

$ docker run --rm docker /bin/sh -c 'docker info'
errors pretty printing info
Client:
 Context:    default
 Debug Mode: false

Server:
ERROR: error during connect: Get "http://docker:2375/v1.24/info": dial tcp: lookup docker on 192.168.65.5:53: no such host

尝试 运行 任何其他重要的 docker 命令,如 buildrun 等,也会发生同样的错误

如果您在特权模式下将 GitLab 运行ner 配置为 运行 容器并挂载 /var/run/docker.sock 到您的所有作业(这是不可取的)在这种情况下,您所有的工作都可以直接与主机上的 docker 守护进程对话。另一个例外可能是,如果您改用 shell 执行程序,并且在 运行ner 为 运行ning 的主机上安装了 docker

dind 服务如何解决这个问题

docker:dind 服务是一个守护进程,只是 为您的工作创建的。这是非常重要的,因为它可以防止并发作业相互踩踏或能够在它们可能没有的地方升级访问权限。

构建开始时,GitLab 运行ner 将创建两个容器:您的作业容器和 docker:dind 容器;它们是连在一起的。当您的作业调用 docker 命令时,您的作业会连接到 docker:dind 容器,然后容器会执行请求的命令。

您的作业创建的任何容器(例如,通过调用 docker rundocker build 作为作业的一部分)由 [=22= 上的守护程序 运行ning 管理] 容器,而不是主机守护进程。如果您 运行 docker ps 进入作业,您会注意到 host 守护程序上的 none 个容器 运行 已列出,尽管如果您 运行 docker ps 在主机上,您会看到作业容器、dind 容器和任何其他 运行ning 容器。


澄清您的其他问题:

When we register docker executor gitlab runner, we choose one image

您的 运行ner 配置中指定的图像只是 默认值 docker 如果作业没有声明任何 image: 键。它不会以任何方式影响 运行ner 运行 的方式。

inside gitlabci, we choose an image under image: or services: fields

当 docker 执行程序 运行 执行您的工作时,它使用 docker run 来执行此操作。 image: 键确定哪个图像用于 运行 您的作业。类似地,services: 定义用于服务容器的图像——服务容器是作业容器的 兄弟 ,并与 链接 连接。

So does that mean this GitLab CI job container runs inside the docker executor container?

没有。我还想澄清一下:runner/executor 不一定在容器中 运行。 Runners 可能作为 Windows 服务安装,或者甚至是直接在系统上 运行ning 的进程。您可以使用运行那些碰巧在容器中的人,但这不会对工作运行.

在任何情况下,您的作业 运行 所在的容器通常总是 运行 直接由主机 docker 守护程序。