kaniko
什么是 kaniko?
学习 kaniko 之前,先要了解什么是 docker daemon docker daemon(docker 守护进程) 是 docker 的核心后台服务,在后台管理所有与容器相关的事情 比如:
- 镜像管理:下载、存储、构建镜像(
docker pull
) - 容器生命周期:创建、启动、停止、删除容器(
docker run / stop / rm
) - 资源分配:给容器分配 cpu、内存等
- 网络和存储:管理容器的网络连接和文件存储
举个例子,当我们运行 docker build
时,表面上是我们输入了 build 命令,实际上是 docker cli 把构建请求发送给 docker daemon,之后 daemon 读取 dockerfile,下载基础镜像,执行每一层指令,生成最终镜像,全程由 daemon 在后台完成
了解 docker daemon 后,再了解什么是 kaniko:
kaniko 是 Google 推出的容器工具,主要目的是在 避免使用 docker daemon 的前提下,根据 dockerfile 构建 docker 镜像,适用于在 容器内 / k8s 集群中构建镜像
- 一般来说,docker daemon 默认运行在宿主机上。如果想在 docker 容器中进行镜像的构建,就需要在容器内运行一个独立的 docker daemon,也就是 Docker-in-Docker(DinD),使容器具备完整的构建能力
- 或者,可以将宿主机的 docker daemon 套接字挂载到容器内,容器直接调用宿主机的 daemon 构建镜像
为什么需要 kaniko
docker 构建镜像是 daemon-based 的,强依赖于宿主机上的 docker daemon 并且需要 特权模式,这对于强调 隔离性和安全 的云原生来说是不太能接受的,因此需要一种能够不使用 docker daemon 就可以构建容器镜像的方式,也就是 kaniko 存在的原因。
安全性:
传统的
docker build
必须用到宿主机的资源,包括 root 权限或 docker 用户组权限、挂载 /var/run/docker.sock,如果出现漏洞或者恶意操作,宿主机就可能被入侵。而 kaniko 可以在非特权容器(无需 –privileged)中构建镜像,保证了安全问题
隔离性:
- 传统的 docker 必须通过宿主机的 docker daemon 执行构建,存在权限相关问题
- kaniko 完全在 用户空间 模拟 docker 构建流程,无需特权权限,彻底隔离了宿主机敏感资源
buildpacks, slugbuilder, slugrunner
什么是 buildpacks?
buildpacks 是一种自动化构建工具,用于将应用程序源代码转化为可运行的容器镜像,然后上传到制品库中,无需手动编写 dockerfile。并且 buildpacks 可以将源代码构建为符合 OCI 规范的镜像。
buildpacks 如何工作?
CNB(Cloud Native Buildpacks) 主要由 3 个组件组成:Builder、Buildpack 和 Stack
Buildpack
本质是一个可执行单元的集合,负责监测代码类型并完成构建,比如:
- detect 脚本检查代码特征,比如发现 pom.xml 则判定为 Java 项目
- build 脚本负责安装依赖、编译代码,生成可运行的应用层
- 每个 buildpack 专注一种语言,多个 buildpack 可组合使用
Builder
buildpacks 会通过 “检测”、“构建”、“输出” 完成一个构建逻辑,为了完成一个应用的构建,通常会使用到多个 buildpacks,那么 builder 就相当于一个 “构建工厂”,负责 将应用源代码构建成应用镜像,builder 中包含:
- 多个有序的 buildpack(比如先 Java 后 Node.js)
- 基础环境镜像
- Lifecycle(检测、构建、导出镜像)
Stack
build image 为 Builders 提供基础环境(比如带 maven 的 Ubuntu 镜像),run image
在运行时为应用镜像提供基础环境,Stack 就是这两者的组合。
工作流程 belike
以 Django 项目为例:
检测阶段(Detect):
Builder 中的每个 Buildpack 依次检查代码:
- Python Buildpack 发现 requirement.txt,标记自己为 “适用”
- Django Buildpack 进一步检测 manage.py 或 settings.py,确认 Django 框架存在
- 其他 Buildpack 若未检测到特征,比如 Node.js 未检测到 package.json,则跳过
构建阶段(Build) 依赖安装
- 根据 requirement.txt 安装 python 依赖,缓存到独立层(避免重复下载)
- 自动创建激活虚拟环境
- 静态文件处理
- 运行 python manage.py collectstatic 收集静态文件
- 数据库迁移
- 运行 python manage.py migrate 生成数据库迁移文件
- 启动配置
- 设置环境变量,生成启动命令
导出镜像(Export)
- Lifecycle 将所有层(依赖、静态文件、编译结果)与 run image 合并
- 生成符合 OCI 规范的最终镜像
- 镜像自动继承 run image 的安全补丁
slugbuilder, slugrunner
slugbuilder
builder 的一种,slugbuilder 会在基础的 heroku runner 镜像上加层,最后组成一个完整的可运行的镜像。
slugbuilder 是镜像构建阶段的基础环境,通过顺序执行多个 buildpack 将应用源代码构建成镜像层
slugrunner
- slugrunner 是应用运行阶段的基础环境,用于承载构建阶段的产物,组成可以最终运行的容器镜像