背景
因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://github.com/moby/buildkit
简介
- 服务端为
buildkitd
,负责和runc
或containerd
后端连接干活,目前只支持这两个后端 - 客户端为
buildctl
,负责解析镜像构建文件Dockerfile
,并向服务端发出构建指令,所以客户端可以和服务端不在一台机器上,也不需要root
权限之类 - 服务端默认使用
runc
后端,但是建议使用containerd
后端,这样构建出的镜像就会存在containerd
的buildkit
名字空间下
下载和安装
官网没看到源, 所以只能用绿色包了 Releases · moby/buildkit
去官网下载一个最新的包 buildkit-v0.16.0.linux-amd64.tar.gz ,解压后得到一个bin目录
把这个bin
目录放到 $PATH
里去
启动buildkitd服务
buildkitd默认运行在前台的,如果需要后面加一个 &
用参数启动
使用 --oci-worker=false --containerd-worker=true
参数,可以让buildkitd服务使用containerd后端
bash
buildkitd --oci-worker=false --containerd-worker=true &
使用配置文件启动
- 创建配置文件
bash
mkdir -p /etc/buildkit/
vim /etc/buildkit/buildkitd.toml
bash
[worker]
[worker.oci]
enabled = false
#platforms = ["linux/amd64"]
[worker.containerd]
address = "/run/containerd/containerd.sock"
enabled = true
platforms = ["linux/amd64"]
namespace = "k8s.io"
gc = true
# gckeepstorage sets storage limit for default gc profile, in MB.
gckeepstorage = 9000
[grpc]
address = ["tcp://0.0.0.0:1234"]
uid = 0
gid = 0
debug = false
[registry]
[registry."registry.opsxlab.cn"]
http = true
insecure = false
说明:
[worker]这是配置文件的主要部分,定义了与工作者(worker)相关的配置。在容器化环境中,工作者是执行容器操作的实体。
[worker.oci]
enabled = false
: 表示不启用 OCI(Open Container Initiative)模式。OCI 是容器的标准化规范,但在这个配置中,OCI 被禁用了。platforms = ["linux/amd64"]
: 这个行被注释掉,表明未指定目标平台。通常这个选项用于指定容器运行的架构平台,比如linux/amd64
(64位Linux系统)。[worker.containerd]
address = "/run/containerd/containerd.sock"
: 指定了containerd
的 Unix 套接字地址,用于与containerd
运行时通信。enabled = true
: 表示启用了containerd
模式,这个配置将容器任务交给containerd
处理。platforms = ["linux/amd64"]
: 这是运行容器的目标平台,这里指定的是linux/amd64
,表示运行在 64 位 Linux 系统上。namespace = "k8s.io"
: 这个选项设置containerd
使用的命名空间为k8s.io
,表明这个containerd
实例是为 Kubernetes 服务的。gc = true
: 启用了垃圾回收(GC)。垃圾回收会自动删除不再需要的镜像或容器。
》-gckeepstorage = 9000
: 设置了默认的垃圾回收存储限制为 9000 MB(约 9GB)。当存储空间达到这个限制时,垃圾回收会启动,清理不再需要的数据。[grpc]
这是 gRPC 的相关配置,用于定义 gRPC 服务的行为。
address = ["tcp://0.0.0.0:1234"]
: 指定 gRPC 服务监听的地址和端口,这里是0.0.0.0:1234
,表示该服务在主机的所有网络接口上监听 1234 端口。uid = 0
: 设置了 gRPC 服务运行时的用户 ID,这里是0
,表示服务以 root 用户身份运行。gid = 0
: 设置了 gRPC 服务运行时的用户组 ID,这里是0
,也表示服务以 root 用户组身份运行。debug = false
: 表示未启用调试模式。如果设置为true
,则会输出更多的调试信息。[registry]
这是容器镜像仓库的相关配置,定义了如何与指定的镜像仓库交互。
[registry."registry.opsxlab.cn"]
这是一个指定的私有镜像仓库
registry.opsxlab.cn
的配置。
http = true
: 允许使用 HTTP 连接,而非 HTTPS。通常情况下,镜像仓库使用 HTTPS 来确保数据传输安全,但这里允许通过不安全的 HTTP 进行通信。insecure = false
: 表示虽然允许使用 HTTP,但仍然要求一些安全措施,这意味着该配置未完全允许不安全的镜像拉取操作。如果设置为true
,则可能完全忽略安全检查。
参考项目
https://gitcode.com/gh_mirrors/bu/buildkit/overview
用此配置启动服务
bash
buildkitd --config /etc/buildkit/buildkitd.toml &
把buildkitd配置成系统服务
参考 https://github.com/moby/buildkit/tree/master/examples/systemd/system
- 增加服务配置文件
bash
vim /usr/lib/systemd/system/buildkitd.service
bash
[Unit]
Description=BuildKitd
ConditionPathExists=/opt/buildkit/buildkitd
After=containerd.service
[Service]
Type=simple
ExecStart=/opt/buildkit/buildkitd
User=root
Restart=on-failure
RestartSec=1500ms
[Install]
WantedBy=multi-user.target
说明:我的buildkitd目录在
/opt/buildkit
下面,根据实际情况修改
- 开机自启动
bash
systemctl daemon-reload && systemctl restart buildkitd && systemctl enable buildkitd
- 验证运行状态
bash
systemctl status buildkitd
构建镜像
bash
buildctl --addr tcp://10.0.11.66:1234 build --frontend=dockerfile.v0 --local context=. --local dockerfile=. --output type=image,name=registry.opsxlab.cn/rd-mgt/ruoyi-admin:0.0.1
说明:
--addr
:表示buildkitd的服务端地址
--frontend
可以使用网关做前端,未做其他尝试,这里直接使用dockerfile.0
--local context
指向当前目录,这是Dockerfile
执行构建时的路径上下文,比如在从目录中拷贝文件到镜像里
--local dockerfile
指向当前目录,表示Dockerfile
在此目录
--output
的 name 表示构建的镜像名称构建完成后镜像会存在本地
containerd
的buildkit
名字空间或配置文件指定的名字空间下