在docker中的docker场景中安装"/var/run/docker.sock"的结果是什么



我读过有人能解释docker.sock来理解/var/run/docker.sock的作用吗?但它在GitLab CI的use docker套接字绑定中的使用让我感到困惑。

以下是他们用于gitlab-runner注册的示例命令:

sudo gitlab-runner register -n 
--url https://gitlab.com/ 
--registration-token REGISTRATION_TOKEN 
--executor docker 
--description "My Docker Runner" 
--docker-image "docker:19.03.12" 
--docker-volumes /var/run/docker.sock:/var/run/docker.sock

我看到两个地方,结果容器可以从中获得docker

  1. unix套接字/var/run/docker.sock
  2. 包括在基本图像CCD_ 6中的CCD_

这不是PATH冲突吗?我认为应该是其中之一,在那里我可以从主机的unix套接字或基本映像中使用docker

我认为--docker-image应该是ubuntu:latestdocker不附带的东西,因为PATHdocker已经来自主机套接字。或者,可以移除docker插座支架。

关于docker的双重包含,这里实际发生了什么?

Unix套接字文件/var/run/docker.sock通常由Docker守护进程创建。如果您运行其他东西作为主容器进程,则不会创建套接字。您可以通过运行具有非Docker主进程的容器来直接查看,如/bin/ls:
docker run --rm docker:19.03.12 ls -l /var/run
docker run --rm docker:19.03.12 ls -l /run

如果要使用/usr/bin/docker二进制文件,它必须存在于容器文件系统中。容器永远不能调用主机上的二进制文件,套接字API也不会生成二进制文件。(一些早期的"使用主机的Docker套接字"帖子主张将二进制文件绑定安装到容器中,但这会导致库依赖性的问题,并使图像不自包含。(

因此,如果您实际需要的只是一个具有docker二进制文件的Docker容器,它可以调用主机的Docker套接字,那么您需要一个像docker这样的映像,其中映像具有/usr/bin/docker,此外,您还需要将主机的/var/run/docker.sock绑定挂载到容器中。

docker run 
--rm 
-v /var/run/docker.sock:/var/run/docker.sock 
docker:19.03.12 
docker ps

您链接到的GitLab设置似乎相当做作。使用docker映像运行作业意味着构建步骤几乎只能运行docker命令。在技术层面上,如果没有docker二进制文件和对正在运行的Docker守护进程的访问权限,就无法启动docker容器;页面顶部描述的shell执行器方法看起来更简单,实际上没有任何缺点。

您还可能会发现,拥有构建时依赖关系(编译器、头文件、静态检查工具等(的Docker映像很方便。这将使您无需对整个构建集群进行更新即可更新这些依赖关系。如果您的构建脚本本身需要调用docker,那么您的构建工具映像需要安装Docker,只需使用普通的RUN apt-get install命令。您需要以相同的方式将主机的Docker套接字推入容器,因此不需要启动单独的Docker守护进程。

首先,您需要了解docker是如何工作的,为了理解这个流,docker有一个服务器和一个客户端docker-clidocker daemon,客户端使用APIS与docker守护进程通信。

CCD_ 31是确保docker客户端和守护进程(服务器(之间连接的UNIX套接字。

由于docker容器与虚拟机不同,它没有kernel,所以在docker中运行的每个容器都使用主机的内核,并在主机内核的顶部构建容器。容器本身没有内核,所以除非使用主机的内核,否则无法在docker中构建docker。

gitlab runner有许多执行器:shellsshdocker等。。。

使用docker执行程序意味着运行程序将创建一个容器,然后克隆您在该容器中的repo,运行您传递的脚本,然后销毁该容器。

gitlan运行程序需要一个基本映像来创建将运行脚本的容器。您不必使用docker:19.03.12或装载/var/run/docker.sock卷,除非您的脚本具有docker命令(或者通常您需要访问docker(,并且这两种策略都不同。您应该知道,装载docker.sock不是docker中的docker。

为了实现docker中的docker,您需要向容器添加--privileged标志,这基本上使容器中的根成为主机上的完整根。它可以管理内核参数,它具有所有功能。

这是关于这个主题的一个很好的参考

最新更新