gitlab-runner 中的 Docker-in-Docker

这篇具有很好参考价值的文章主要介绍了gitlab-runner 中的 Docker-in-Docker。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

runner executor

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

让人困惑的是其它一些 executor:比如 Docker-SSHDocker-SSH+machine,还好从 GitLab Runner 10.0 开始, 这两者就被废弃了,并且将在后续某个版本中移除;还有 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文章来源地址https://www.toymoban.com/news/detail-447823.html

到了这里,关于gitlab-runner 中的 Docker-in-Docker的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Git引起的 gitlab-runner 报错

    在查看gitlab CI作业时,发现意外报错  报错时由于git版本引起的,查看git版本 使用yum list | grep git,yum默认阿里云源里面最新的版本就是1.18.3  我们需要升级git 的版本 3、检查版本测试 版本已经更新最2.31了,再次执行gitlab CI作业,报错已经解决了。  

    2024年02月12日
    浏览(44)
  • 本地gitlab-runner的创建与注册

    引言 之前通过一些方式在本地创建runner,时而会出现一些未知的坑,所以写下本文记录runner可以无坑创建的方式。 以下注册runner到相应仓库的前提是已经在本地安装了gitlab-runner 具体安装方式见官网 本地gitlab-runner安装常用的指令 查看gitlab runner服务状态 sudo gitlab-runner statu

    2024年03月25日
    浏览(59)
  • kubernetes基于helm部署gitlab-runner

    这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab-runner。 先决条件: 已运行的 Kubernetes 集群 已运行的 gitlab 实例 项目地址:https://gitlab.com/gitlab-org/charts/gitlab-runner 官方文档:https://docs.gitlab.com/runner/install/kubernetes.html 1、登陆UI创建新的runner 选择Your work– Admin Area 2、选择CI/

    2024年02月13日
    浏览(35)
  • 【基于 GitLab 的 CI/CD 实践】02、gitlab-runner 实践

    目录 一、gitlab-runner 简介 1.1 要求 1.2 特点 二、GitLab Runner 安装 2.1 使用 GItLab 官方仓库安装 2.2 使用 deb/rpm 软件包 2.3 在容器中运行 GitLab Runner 三、GitLab Runner 注册 3.1 GitLabRunner 类型 3.2 获取 runner token 获取 shared 类型 runner token   ​获取 group 类型的 runner token   ​获取 speci

    2024年02月16日
    浏览(54)
  • GitLab与GitLab Runner安装(RPM与Docker方式),CI/CD初体验

    GitLab 是一个强大的版本控制系统和协作平台,记录一下在实际工作中关于 GitLab 的安装使用记录。 一开始使用 GitLab 时,是在 CentOS7 上直接以 rpm 包的方式进行安装,仅作为代码托管工具来使用,版本: 14.10.4 。 后续预研 GitLab 的 CI/CD 及流水线时,采用 Docker 方式安装,版本

    2024年02月11日
    浏览(42)
  • gitlab CI/CD 安装 gitlab runner

    一、为什么需要安装gitlab runner ? 极狐GitLab Runner 是在流水线中运行作业的应用,与极狐GitLab CI/CD 配合运作。 说白了就是你部署的一个agent。 二、如何安装? 1.介绍通过helm部署github runner 2.helm添加仓库 helm repo add gitlab https://charts.gitlab.io 3.拉取chars helm pull gitlab/gitlab-runner -- 拉

    2024年02月14日
    浏览(65)
  • gitlab runner

    # install ``` # Download the binary for your system sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 # Give it permission to execute sudo chmod +x /usr/local/bin/gitlab-runner # Create a GitLab Runner user sudo useradd --comment \\\'GitLab Runner\\\' --create-home gitlab-r

    2024年02月07日
    浏览(38)
  • GitLab Runner 实现项目 CI/CD 发布

    Gitlab实现CICD的方式有很多,比如通过Jenkins,通过Gitlab Runner等,今天主要介绍后者。Gitlab在安装的时候,就默认包含了Gitlab CI的能力,但是该能力只是用于协调作业,并不能真的去执行作业,因此需要搭配Gitlab Runner来作为执行器实现具体的CICD工作。Gitlab Runner可以被安装在任

    2024年01月17日
    浏览(64)
  • 【云原生】DevOps之使用Gitlab Runner进行CICD

    在很久之前的文章中,我们已经搭建过了Jenkins+Docker+Harbor+SpringCloud微服务持续集成自动化部署,今天来介绍Gitlab原生的Gitlab Runner CICD功能。 Gitlab实现CICD的方式有很多,比如通过Jenkins,通过Gitlab Runner等,今天主要介绍后者。Gitlab在安装的时候,就默认包含了Gitlab CI的能力,但

    2024年02月03日
    浏览(48)
  • k3s x GitLab Runner Operator,GitLab CI 云原生构建新体验

    GitLab CI 是非常常用的一款 CI/CD 工具,只需要在 .gitlab-ci.yml 文件中用 YAML 语法编写 CI/CD 流水线即可。而 GitLab CI 能够运行的关键组件是 GitLab Runner。GitLab Runner 是一个轻量级、高扩展的代理,主要用来执行 GitLab CI/CD 流水线中的 Job,然后将 Job 的执行结果返回 GitLab 实例。 Gi

    2024年01月21日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包