在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

  • unix套接字
    /var/run/docker.sock
  • 基本图像中包含的
    docker
    二进制文件
    docker:19.03.12
  • 这不是路径冲突吗?我认为应该是这样或那样,在那里我可以从主机的unix套接字或基本映像获得使用
    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),而且这两种策略是不同的。你应该知道,mount
    docker.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查找将解析为内部创建的套接字。我在这里错过了什么?关于什么