ToB企服应用市场:ToB评测及商务社交产业平台

标题: gitlab-runner 中的 Docker-in-Docker [打印本页]

作者: 涛声依旧在    时间: 2023-5-17 15:13
标题: gitlab-runner 中的 Docker-in-Docker
笔者个人理解:gitlab-runner 安装后就是一个监听状态的 runner,而通过 gitlab-runner register 注册的“实例”其实只是预定义的配置节,当消息抵达后,gitlab-runner 根据消息内容选择相应的配置节启动执行线程。为了方便阐述和理解,本文也将每个配置节/执行线程称为 runner 实例。
runner executor

runner 实例的执行环境,一般用的较多的是 shell 和 docker,这两者的区别无需赘述。
让人困惑的是其它一些 executor:比如 Docker-SSH 和 Docker-SSH+machine(从 GitLab Runner 10.0 开始, Docker-SSH 和 Docker-SSH+machine executors 被废弃了,并且将在后续某个版本中移除);还有 Docker machine,这个概念原本是 Docker 提出的,但是后面被 Docker 弃用了,GitLab 为了向前兼容保留了下来,也可以不用细究。
对于 docker executor 来说,runner 执行 job 的流程如下(摘自官网):
显然,第 1 步要启动容器,如果 runner 本身是以 docker 容器方式安装运行的,那么就涉及到 Docker-in-Docker 的概念了。
Docker-in-Docker

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

如前所述,以 docker 方式安装 runner,且 executor 采用 docker,那么就要 Docker-in-Docker。因为 runner 只是启动新容器,不要求启动的容器在 runner 容器内部,我们可以采用第 1 种方式,如下:
  1. docker run -d --name gitlab-runner --restart always \
  2.   -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  3.   -v /var/run/docker.sock:/var/run/docker.sock \  # 挂载 socket
  4.   gitlab/gitlab-runner:latest
复制代码
另外,如果 docker executor 在 CI/CD job 中涉及到 docker 指令,那么也要 Docker-in-Docker。关键步骤如下:
  1. sudo gitlab-runner register -n \
  2.   --executor docker \
  3.   --docker-image "docker:20.10.16" \
  4.   --docker-privileged \  # privileged mode
  5.   --other arguments
复制代码
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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4