我读过有人能解释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
。
- unix套接字
/var/run/docker.sock
- 包括在基本图像CCD_ 6中的CCD_
这不是PATH
冲突吗?我认为应该是其中之一,在那里我可以从主机的unix套接字或基本映像中使用docker
。
我认为--docker-image
应该是ubuntu:latest
或docker
不附带的东西,因为PATH
的docker
已经来自主机套接字。或者,可以移除docker插座支架。
关于docker
的双重包含,这里实际发生了什么?
/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-cli
和docker daemon
,客户端使用APIS
与docker守护进程通信。
CCD_ 31是确保docker客户端和守护进程(服务器(之间连接的UNIX套接字。
由于docker容器与虚拟机不同,它没有kernel
,所以在docker中运行的每个容器都使用主机的内核,并在主机内核的顶部构建容器。容器本身没有内核,所以除非使用主机的内核,否则无法在docker中构建docker。
gitlab runner有许多执行器:shell
ssh
docker
等。。。
使用docker执行程序意味着运行程序将创建一个容器,然后克隆您在该容器中的repo,运行您传递的脚本,然后销毁该容器。
gitlan运行程序需要一个基本映像来创建将运行脚本的容器。您不必使用docker:19.03.12
或装载/var/run/docker.sock
卷,除非您的脚本具有docker命令(或者通常您需要访问docker(,并且这两种策略都不同。您应该知道,装载docker.sock
不是docker中的docker。
为了实现docker中的docker,您需要向容器添加--privileged
标志,这基本上使容器中的根成为主机上的完整根。它可以管理内核参数,它具有所有功能。
这是关于这个主题的一个很好的参考