1. 为什么需要BuildKit?从Docker到Containerd的构建之路
如果你和我一样,从Docker转向Containerd,遇到的第一个头疼问题就是:我的镜像怎么构建?在Docker时代,一句 docker build -t myapp . 就能搞定一切,但切换到Containerd后,你会发现熟悉的 ctr 命令根本没有 build 这个子命令。我第一次尝试时,系统直接给我泼了盆冷水,提示 buildctl 找不到。这其实是因为Containerd的设计哲学是“做一件事,并做好它”——它专注于容器运行时和镜像管理,而把镜像构建这个功能剥离了出去,交给了更专业的工具。
这就是BuildKit登场的时候了。你可以把它理解为Docker引擎里那个负责构建镜像的“大脑”被独立拆分出来了。它由Docker公司(现在是Mirantis)开源并维护,是目前Containerd生态下构建镜像的事实标准。我实测下来,它的构建速度比传统Docker构建要快不少,尤其是在处理复杂的多阶段构建和大量依赖层时,缓存机制非常高效。
那么,这套组合拳是怎么打的呢?简单来说,我们通常会用 nerdctl 这个命令行工具(它长得和 docker 命令几乎一模一样)来发起构建请求,nerdctl 背后会去调用 buildctl 客户端,buildctl 再与后台守护进程 buildkitd 通信,而 buildkitd 最终会利用Containerd作为“工人”(worker)来实际执行构建任务,并把构建好的镜像直接存到Containerd的镜像仓库里。整个过程清晰、高效,并且完全兼容现有的Dockerfile,你之前写的那些构建脚本几乎不用改就能跑起来。
2. 从零开始:BuildKit的安装与系统服务配置
好了,理论说再多不如动手做一遍。下面我就带你一步步把BuildKit装起来,并配置成系统服务,让它开机自启,稳定运行。
2.1 下载与安装二进制文件
首先,我们需要去BuildKit的GitHub发布页下载最新的稳定版。我习惯用 wget 直接拉取,这里以 v0.12.0 版本为例,你可以随时替换成更新的版本。
# 下载BuildKit压缩包
wget https://github.com/moby/buildkit/releases/download/v0.12.0/buildkit-v0.12.0.linux-amd64.tar.gz
# 解压到 /usr/local 目录,这是存放本地编译软件的标准位置
sudo tar -xzf buildkit-v0.12.0.linux-amd64.tar.gz -C /usr/local/
解压后,你会发现在 /usr/local/bin/ 目录下多了好几个可执行文件,其中最关键的两个是:
buildkitd:这是构建服务的守护进程,以后台方式运行,负责接收和处理构建任务。buildctl:这是命令行客户端,我们(或nerdctl)通过它来向buildkitd发送构建指令。
为了让系统在任何位置都能找到这些命令,通常它们已经在 /usr/local/bin 下了,而这个目录默认就在系统的 PATH 环境变量里。你可以用 which buildctl 检查一下,如果能看到路径,就说明安装成功了。
2.2 配置Systemd服务(让BuildKit在后台稳定运行)
让buildkitd在终端里直接跑不是长久之计,终端一关服务就停了。生产环境我们肯定要用systemd把它管起来。这样能实现开机自启、自动重启、集中日志管理等一系列好处。
创建一个service文件:
sudo vim /etc/systemd/system/buildkit.service
把下面的配置内容贴进去。这里有个关键点:我们通过 --oci-worker=false --containerd-worker=true 参数,明确告诉BuildKit使用Containerd作为后端工作器,而不是默认的runc。这样做的好处是构建出来的镜像会直接存入Containerd,省去了导入导出的步骤,效率更高。
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
After=network.target containerd.service
Wants=containerd.s

2540

被折叠的 条评论
为什么被折叠?



