在docker场景中的docker中装载“/var/run/docker.sock”的结果是什么?
我通过阅读了解了在docker场景中的docker中装载“/var/run/docker.sock”的结果是什么?,docker,gitlab-ci,gitlab-ci-runner,unix-socket,docker-in-docker,Docker,Gitlab Ci,Gitlab Ci Runner,Unix Socket,Docker In Docker,我通过阅读了解了/var/run/docker.sock的功能,但它在GitLab CI中的使用让我感到困惑 下面是用于注册gitlab runner的示例命令: sudo gitlab-runner register -n \ --url https://gitlab.com/ \ --registration-token REGISTRATION_TOKEN \ --executor docker \ --description "My Docker Runner&
/var/run/docker.sock
的功能,但它在GitLab CI中的使用让我感到困惑
下面是用于注册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
/var/run/docker.sock
docker
二进制文件docker:19.03.12
docker
的能力
我认为,--docker image
应该是ubuntu:latest
或者类似于docker
的东西,因为路径的docker
已经来自主机套接字。或者,将移除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套接字,那么您需要一个映像,就像映像中有一个/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 executor方法似乎更简单,并且没有任何缺点
您还可能会发现,拥有构建时依赖项(编译器、头文件、静态检查工具等)的Docker映像也很方便。这将允许您更新这些依赖项,而不必对整个构建集群进行更新。如果构建脚本本身需要调用docker
,那么构建工具映像需要安装docker,只需使用正常的运行apt get install
命令。您需要以相同的方式将主机的Docker套接字推入容器,因此,您不需要启动单独的Docker守护进程。首先,您需要了解Docker的工作原理为了了解此流程,Docker有一个服务器和一个客户端Docker cli
和Docker守护进程
客户端使用API
与Docker守护进程通信
docker.sock
是UNIX套接字,用于确保docker客户端和守护进程(服务器)之间的连接
与虚拟机不同,docker容器没有内核
,因此在docker中运行的每个容器都使用主机的内核,并在主机内核的顶部构建容器。
容器本身没有内核,因此除非使用主机的内核,否则无法在docker中构建docker
gitlab运行程序有许多执行器:shell
ssh
docker
等等
使用docker executer意味着运行程序将创建一个容器,然后将您复制到该容器中,运行您传递的脚本,然后销毁该容器
docker run \
--rm \
-v /var/run/docker.sock:/var/run/docker.sock \
docker:19.03.12 \
docker ps
gitlan运行程序需要一个基本映像来创建将运行脚本的容器。你不必使用docker:19.03.12
或mount/var/run/docker.sock
卷,除非你的脚本中有docker命令(或者通常你需要访问docker),而且这两种策略是不同的。你应该知道,mountdocker.sock
不是docker中的docker
为了在docker中实现docker,您需要向容器添加--privileged
标志,该标志基本上使容器中的根成为主机上的完整根。它可以管理内核参数,具有所有功能
这是一个关于这个主题的好方法也许这会有所帮助:@DucNguyen Yup帮助我了解了/var/run/docker.sock
,但是gitlab runner
在docker图像中的docker上安装了docker套接字,而不是作为链接中描述的替代方法。这就是问题所在。(我不认为您描述的设置是“Docker in Docker”。我习惯了这个术语,意思是“在容器中运行Docker守护程序”,而不是“在访问主机Docker守护程序的容器中运行Docker
二进制文件”。您链接到的页面描述了Docker设置中的Docker,位于您提到的特定锚点的正上方。)回答得好。如果我运行docker run--rm docker:19.03.12 docker ps
(因此没有安装套接字),则docker TCP查找失败时出错。我认为,因为这里的主要进程是docker ps
(而不是ls
),所以会创建套接字,docker查找将解析为内部创建的套接字。我在这里错过了什么?关于什么