在 Docker 场景中,在 Docker 中挂载 `/var/run/docker.sock` 的结果是什么?

Mar*_*hac 8 unix-socket docker gitlab-ci gitlab-ci-runner docker-in-docker

我读过Can Anybodyterpret docker.sock来了解/var/run/docker.sock它的作用,但它在 GitLab CI 的Use Docker socket binding中的使用让我感到困惑。

这是他们的注册命令示例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
Run Code Online (Sandbox Code Playgroud)

我看到可以从两个地方获取生成的容器docker

  1. Unix 套接字/var/run/docker.sock
  2. docker包含在基础映像中的二进制文件docker:19.03.12

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

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

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

Dav*_*aze 3

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
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

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

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