首页 > 其他分享 >gitlab-runner 中的 Docker-in-Docker

gitlab-runner 中的 Docker-in-Docker

时间:2023-05-17 14:35:41浏览次数:74  
标签:容器 runner gitlab -- Docker docker

笔者个人理解:gitlab-runner 安装后就是一个监听状态的 runner,而通过 gitlab-runner register 注册的“实例”其实只是预定义的配置节,当消息抵达后,gitlab-runner 根据消息内容选择相应的配置节启动执行线程。为了方便阐述和理解,本文也将每个配置节/执行线程称为 runner 实例

runner executor

runner 实例的执行环境,一般用的较多的是 shelldocker,这两者的区别无需赘述。

让人困惑的是其它一些 executor:比如 Docker-SSHDocker-SSH+machine(从 GitLab Runner 10.0 开始, Docker-SSH 和 Docker-SSH+machine executors 被废弃了,并且将在后续某个版本中移除);还有 Docker machine,这个概念原本是 Docker 提出的,但是后面被 Docker 弃用了,GitLab 为了向前兼容保留了下来,也可以不用细究。

对于 docker executor 来说,runner 执行 job 的流程如下(摘自官网):

  1. The runner starts a Docker container using the defined entrypoint. The default from Dockerfile that may be overridden in the .gitlab-ci.yml file.
  2. The runner attaches itself to a running container.
  3. The runner prepares a script (the combination of before_script, script, and after_script).
  4. The runner sends the script to the container’s shell stdin and receives the output.

显然,第 1 步要启动容器,如果 runner 本身是以 docker 容器方式安装运行的,那么就涉及到 Docker-in-Docker 的概念了。

Docker-in-Docker

有些时候,我们需要在容器内部执行 docker 指令,一般有两种方式:

  1. 挂载宿主机 docker 环境。启动容器时挂载 /var/run/docker.sock,这样在容器内执行 docker 指令其实就等同于在容器外(宿主机中)执行 docker 指令。比如 docker build 构建一个镜像,该镜像并不存在于容器内部,而是在宿主机中。所以该方法并不是严格意义上的 docker in docker
  2. 容器内部有自己的一套 docker 环境。使用 docker:dind 镜像,可以直接使用它作为主容器,或是作为其它容器的服务容器(其它容器与之通信)。它在 docker 镜像(该镜像只包含客户端指令集)基础上安装了 Docker Daemon,因此可作为独立的 docker 环境使用,是真正意义上的 docker in docker。然而,除非你真正需要在容器内嵌套容器,或者某些场景下无法使用第 1 种方式,否则还是建议避免使用该方式。

这两种方式需要执行指令的容器处于 privileged mode,有一定的安全风险(privileged=true 将使得容器内 root 拥有宿主 root 的权限,否则只是宿主机上的普通用户),因此市面上又出现了一种 Using Nestybox sysbox Docker runtime 的方法,感兴趣的朋友请查阅参考资料,此处按过不表。

in gitlab-runner

如前所述,以 docker 方式安装 runner,且 executor 采用 docker,那么就要 Docker-in-Docker。因为 runner 只是启动新容器,不要求启动的容器在 runner 容器内部,我们可以采用第 1 种方式,如下:

docker run -d --name gitlab-runner --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \  # 挂载 socket
  gitlab/gitlab-runner:latest

另外,如果 docker executor 在 CI/CD job 中涉及到 docker 指令,那么也要 Docker-in-Docker。关键步骤如下:

  1. 注册 runner 实例,并配置其启动的容器为 privileged mode(注意配置的是每次 job 执行时启动的容器,而 runner 所在的容器,且 runner 并不一定是 docker 形式)。
sudo gitlab-runner register -n \
  --executor docker \
  --docker-image "docker:20.10.16" \
  --docker-privileged \  # privileged mode
  --other arguments
  1. 接下来,可以选择任一种方式实现 Docker-in-Docker:
    • config.toml 中增加卷映射 volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
    • 或者在 .gitlab-ci.yml 中指定 docker:dind 如:
    services:
        - docker:20.10.16-dind
    

TLS 配置

如果在第 2 步采用 docker:dind 方式,那么由于涉及到容器间通信,需要选择是否启用 TLS。

若是,则在注册 runner 实例时,增加一个参数 --docker-volumes "/certs/client", 也可手动编辑 config.toml,增加卷映射 volumes = ["/certs/client", "/cache"];然后在 .gitlab-ci.yml 中设置变量 DOCKER_TLS_CERTDIR: "/certs"

若否,则在 .gitlab-ci.yml 中设置变量 DOCKER_TLS_CERTDIR: ""DOCKER_HOST: tcp://docker:2375

TLS 若未正确配置,会报 Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running? 错误。

参考资料

How To Run Docker in Docker Container 3 Easy Methods

标签:容器,runner,gitlab,--,Docker,docker
From: https://www.cnblogs.com/newton/p/17408489.html

相关文章

  • docker 开启2375端口,提供外部访问docker
      一、编辑docker文件:/usr/lib/systemd/system/docker.service命令:vim/usr/lib/systemd/system/docker.service修改ExecStart行,增加内容-Htcp://0.0.0.0:2375,修改后如下:ExecStart=/usr/bin/dockerd-Htcp://0.0.0.0:2375-Hfd://--containerd=/run/containerd/con......
  • docker 部署 RocketMQ
    1.安装nameServer1.搜索镜像dockersearchrocketmq2.拉取镜像dockerpullrocketmqinc/rocketmq 3.创建数据目录mkdir-p/usr/local/software/rocketmq/nameserver/logs/usr/local/software/rocketmq/nameserver/store4.运行docker命令dockerrun-d--r......
  • 在gitlab上,把旧项目的分支代码,转移到新项目里,Git命令语句
    1clone老项目#gitclonegit@xxxx/demo.git2进入到demo目录#cddemo3移除老项目的地址替换成新项目#gitremoteset-url--pushorigingit@xxx/account.git4将镜像推到远程#gitpush-uoriginmaster ......
  • 记录内网Docker启动Stable-Diffusion遇到的几个坑
    摘要:最近看到K8s启动stable-diffusion的文章,想着在自己开发环境复现一下。没想到在内网环境还遇到这么多问题,记录一下。本文分享自华为云社区《内网Docker启动Stable-Diffusion(AI作画)》,作者:tsjsdbd。最近看到K8s启动stable-diffusion的文章,想着在自己开发环境复现一下。没想到......
  • [转]如何在debian11上安装docker
    原文地址:如何在debian11上安装docker-知乎虽然kubernetes早在2018年5月就宣布用户可以不用安装docker,直接使用containerd作为CRI运行时,docker依然在生产环境中有很高的装机量,并且在单机开发环境中使用docker相对containerd更为方便。因此在2021年docker依然有其存在价值。202......
  • ubuntu安装docker官方指导方法-附官方指导地址
    先上官方指导地址:https://docs.docker.com/engine/install/ubuntu/再上官方指导: InstallDockerEngineonUbuntu TogetstartedwithDockerEngineonUbuntu,makesureyoumeettheprerequisites,andthenfollowtheinstallationsteps.Prerequisites......
  • 低版本docker在dockerfile构建时的NO_PUBKEY问题
     问题我在ubuntu22.04的容器里面运行aptupdate的时候出现了以下报错[root@VM-16-9-centosdocker-kubuntu]#dockerrun--rm-itubuntu:22.04bashroot@8ac245b487e6:/#aptupdateGet:1http://security.ubuntu.com/ubuntujammy-securityInRelease[110kB]Get:2......
  • docker
    docker与虚拟机 ......
  • .Net 5 CanalSharp Mysql CDC (增量同步,捕获变更数据)Docker 系列之 Canal (CDC 增量
    CanalSharp阿里云的解决方案,需要两部分Canal 服务端要和Mysql连在一起(目前我是用docker部署的服务)另外一部分就是CanalSharp单独的客户端服务(.Net5服务)CanalSharp文档可以参考:https://canalsharp.azurewebsites.net/zh/安装服务,可以点击下边的连接。Docker系列之Canal......
  • 使用Docker搭建Sonarqube
    (1)拉取镜像dockerpullpostgresdockerpullsonarqube (2)启动容器启动postgresdockerrun\-d\--namepostgres\-p5432:5432\-ePOSTGRES_USER=sonar\-ePOSTGRES_PASSWORD=123456\postgres创建volumedockervolumecreate--namesonarqube_datadocke......