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 的流程如下(摘自官网):
- The runner starts a Docker container using the defined entrypoint. The default from Dockerfile that may be overridden in the .gitlab-ci.yml file.
- The runner attaches itself to a running container.
- The runner prepares a script (the combination of before_script, script, and after_script).
- 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 指令,一般有两种方式:
- 挂载宿主机 docker 环境。启动容器时挂载
/var/run/docker.sock,这样在容器内执行 docker 指令其实就等同于在容器外(宿主机中)执行 docker 指令。比如docker build构建一个镜像,该镜像并不存在于容器内部,而是在宿主机中。所以该方法并不是严格意义上的docker in docker。 - 容器内部有自己的一套 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。关键步骤如下:
- 注册 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
- 接下来,可以选择任一种方式实现 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
gitlab-runner 中的 Docker-in-Docker的更多相关文章
- gitlab runner使用docker报错(x509: certificate signed by unknown authority)定位
如果gitlab runner使用docker,docker是普通配置,配置好后,runner就可以正常执行任务了. 另外一个环节Docker配置了tls加密连接,添加runner后,runner的配 ...
- k8s Gitlab CI/CD 之自动编译Docker镜像并推送到指定的Registry
环境介绍: 说明 节点 ip 系统 Gitlab Server git.ds.com 10.0.1.179 CentOS 7.5.1804 Gitlab Runner 10.0.1.178 Cen ...
- .NetCore中的程序通过Docker在CentOS中部署
基础说明 安装Docker过程就略过了 创建一个Asp.Net Core程序 启用Docker支持,会生成Dockerfile文件,接下来看下这个文件,当然不同的版本生成的具体可能不一致 FROM m ...
- CentOS7系列--5.2CentOS7中配置和管理Docker
CentOS7配置和管理Docker Docker是操作系统级别的虚拟化工具,它能自动化布署在容器中的应用 1. 安装Docker 1.1. 安装Docker相关软件 [root@server1 ~] ...
- docker微服务部署之:四、安装docker、docker中安装mysql和jdk1.8、手动构建镜像、部署项目
docker微服务部署之:三,搭建Zuul微服务项目 1.Centos7安装Docker 详见:Centos7安装Docker 2.Docker中安装jdk1.8 详见:使用Docker构建jdk1. ...
- pycharm中创建并设置docker解释器
在Windows上使用Docker的其中一个目的是使其与PyCharm结合,形成Python代码的解释器,避免重复的Python解释环境搭建的问题,同时保持Windows开发环境和部署环境所用的Pyt ...
- 在Ubuntu中安装Docker和docker的使用
1.在Ubuntu中安装Docker 更新ubuntu的apt源索引 sudo apt-get update 安装包允许apt通过HTTPS使用仓库 sudo apt-get install \ ap ...
- Jenkins在Pod中实现Docker in Docker并用kubectl进行部署
Jenkins在Pod中实现Docker in Docker并用kubectl进行部署 准备工作 安装Jenkins Jenkins的kubernetes-plugin使用方法 说明 Jenkins的 ...
- 不同network中的两个docker容器
1. 创建docker网络 docker network create --subnet 172.18.0.1/16 test docker network ls 2. 创建两个容器指定docker ...
- 在ubuntu server中安装和配置docker
经过一段时间针对不同版本的学习,现在总结当前最新的安装配置过程(应该也是比较简单的) 如果不清楚什么是docker,请参考 https://www.docker.com/ 准备工作 建议在安装之前运行 ...
随机推荐
- Constant width to height ratio
<div class="constant-width-to-height-ratio"></div> .constant-width-to-height-r ...
- Git 仓库7K stars!学Java开源项目austin要多久?
我是3y,一年CRUD经验用十年的markdown程序员常年被誉为职业八股文选手 开源项目消息推送平台austin仓库地址: 消息推送平台推送下发[邮件][短信][微信服务号][微信小程序][企业微 ...
- Python ArcPy批量拼接长时间序列栅格图像
本文介绍基于Python中ArcPy模块,对大量不同时相的栅格遥感影像按照其成像时间依次执行批量拼接的方法. 在前期的文章Python arcpy创建栅格.批量拼接栅格中,我们介绍了利用Pyt ...
- 如何解决 Iterative 半监督训练 在 ASR 训练中难以落地的问题丨RTC Dev Meetup
前言 「语音处理」是实时互动领域中非常重要的一个场景,在声网发起的「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自微软亚洲研究院.声网.数美科技的技术专家,围绕该话 ...
- MapReduce之简单的数据清洗----课堂测试
今天的课堂测试第一步是做简单的数据清洗,直到现在我才知道只是把文本文件的数据改成相应的格式,而我做的一直是寻找一条数据,并转换成相应的格式,但是呢,我感觉还是很高兴的,虽然没有按时完成任务,但也学到了 ...
- 二进制安装Kubernetes(k8s) v1.24.0 IPv4/IPv6双栈 (三主俩从)
二进制安装Kubernetes(k8s) v1.24.0 IPv4/IPv6双栈 (三主俩从) Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安装 后续尽可 ...
- LLaMA:开放和高效的基础语言模型
LLaMA:开放和高效的基础语言模型 论文:https://arxiv.org/pdf/2302.13971.pdf 代码:https://github.com/facebookresearch/ll ...
- LeeCode 316周赛复盘
T1:判断两个事件是否存在冲突 思路:判断两个区间是否有交集 public boolean haveConflict(String[] event1, String[] event2) { // 比较 ...
- .NET Core MongoDB数据仓储和工作单元模式实操
前言 上一章节我们主要讲解了MongoDB数据仓储和工作单元模式的封装,这一章节主要讲的是MongoDB用户管理相关操作实操.如:获取所有用户信息.获取用户分页数据.通过用户ID获取对应用户信息.添加 ...
- Appweb-6.1.1 移植到ARM
Appweb-6.1.1 移植到ARM 编译环境:ubuntu-12.04 x64 开发平台:Hi3535 arm版 编译版本:appweb-6.1.1.zip ESP下载地址=> ESP we ...