[转帖]用buildkit和containerd构建镜像

buildkit,containerd,构建,镜像 · 浏览次数 : 0

小编点评

**构建工具** 由于K8s抛弃了Docker,需要使用一个单独的镜像构建工具来构建镜像。Buildkit是Docker公司扶持的开源工具,可以用于构建各种平台的镜像。 **构建过程** 1. 下载并解压Buildkit的bin目录 2. 将bin目录添加到系统路径 3. 创建系统服务文件`buildkit.service` 4. 配置服务文件 5. 启动服务 **配置** `buildkit.service`文件可以用于配置服务,包括指定服务地址、端口、用户名和密码。示例配置文件位于`/etc/buildkit/buildkitd.toml`中。 **使用** 启动服务后,可以使用`docker build`命令来构建镜像。例如: ```bash docker build -t my-image . ``` **注意** * `buildkitd`默认使用containerd后端。 * `containerd`是一个容器管理工具。 * `buildkit`可以构建各种平台的镜像,包括Docker、Kubernetes和容器。 * 建议使用containerd后端,因为它提供更好的性能和稳定性。

正文

https://zhuanlan.zhihu.com/p/366671300

最近因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 

架构及限制

  1. 服务端为buildkitd,负责和runc或containerd后端连接干活,目前只支持这两个后端
  2. 客户端为buildctl,负责解析镜像构建文件Dockerfile,并向服务端发出构建指令,所以客户端可以和服务端不在一台机器上,也不需要root权限之类
  3. 服务端默认使用runc后端,但是建议使用containerd后端,这样构建出的镜像就会存在containerd的buildkit名字空间下

下载安装

  1. 官网没看到源, 所以只能用绿色包了 Releases · moby/buildkit
  2. 去官网下载一个最新的包 buildkit-v0.8.2.linux-amd64.tar.gz ,解压后得到一个bin目录
  3. 把这个bin目录放到 $PATH 里去

启动buildkitd服务

buildkitd默认运行在前台的,如果需要后面加一个 &

用参数启动

使用 --oci-worker=false --containerd-worker=true 参数,可以让buildkitd服务使用containerd后端

buildkitd --oci-worker=false --containerd-worker=true & 

使用配置文件启动

创建配置文件

mkdir -p /etc/buildkit/
vim /etc/buildkit/buildkitd.toml

配置使用containerd后端,禁用oic后端,并把默认名字空间改为"default"(这是为了以后和nerdctl配合使用),把平台限制为本机类型amd64,配置垃圾回收空间限制

[worker.oci]
  enabled = false

[worker.containerd]
  enabled = true
  # namespace should be "k8s.io" for Kubernetes (including Rancher Desktop)
  namespace = "default"
  platforms = [ "linux/amd64" ]
  gc = true
  # gckeepstorage sets storage limit for default gc profile, in MB.
  gckeepstorage = 9000

用此配置启动服务

buildkitd --config /etc/buildkit/buildkitd.toml & 

把buildkitd配置成系统服务

参考 

首先,把 之前下载解压出来的bin目录里的文件拷贝到系统目录下(那个目录里其他文件用不上)

cd bin
cp buildctl /usr/local/bin
cp buildkitd /usr/local/bin

增加服务配置文件

vim /usr/lib/systemd/system/buildkit.service

如下

[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socket
Documentation=https://github.com/moby/buildkit

[Service]
Type=notify
ExecStart=/usr/local/bin/buildkitd --addr fd://

[Install]
WantedBy=multi-user.target

增加socket配置文件

vim /usr/lib/systemd/system/buildkit.socket

如下

[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Socket]
ListenStream=%t/buildkit/buildkitd.sock
SocketMode=0660

[Install]
WantedBy=sockets.target

激活并启动服务

systemctl enable buildkit
systemctl start buildkit

注意:如果配置文件 /etc/buildkit/buildkitd.toml 存在,服务启动时会自动装载该配置文件

构建本地镜像

buildctl build \
    --frontend=dockerfile.v0 \
    --local context=. \
    --local dockerfile=. \
    --output type=image,name=docker.io/username/image:tag

解释:

  1. frontend可以使用网关做前端,未做其他尝试,这里直接使用dockerfile.0
  2. --local context 指向当前目录,这是Dockerfile执行构建时的路径上下文,比如在从目录中拷贝文件到镜像里
  3. --local dockerfile指向当前目录,表示Dockerfile在此目录
  4. --output 的 name 表示构建的镜像名称
  5. 构建完成后镜像会存在本地containerd的buildkit名字空间或配置文件指定的名字空间下

使用nerdctl构建本地镜像

参见 How:nerdctl安装和使用

查看本地镜像

ctr -n buildkit i ls

注意:

  1. ctr是containerd自带的命令行工具,除了构建镜像不能干,其他docker-cli的活它都可以干
  2. 因为buildkitd的后端选择了containerd,本地镜像会去到containerd的本地存储
  3. 默认本地镜像都存在buildkit名字空间下,要修改此名字空间, 可以去配置 /etc/buildkit/buildkitd.toml

使用ctr推送镜像

ctr -n buildkit i push -u username:password docker.io/username/image:tag

注意:

  1. ctr推送时直接把registry的帐号密码当成参数 -u
  2. 参数中的帐号密码是明码的,慎用

构建镜像并推送到registry

registry的帐号密码配置在 ~/.docker/config.json 文件中 , 沿用了Docker的配置,虽然我们并没有装Docker

{
        "auths": {
                "docker.io": {
                        "auth": "base64(username:password)"
                }
        }
}

执行构建并推送到registry

buildctl build \
    --frontend=dockerfile.v0 \
    --local context=. \
    --local dockerfile=. \
    --output type=image,name=docker.io/username/image:tag,push=true

解释:

  1. --output 的 name 表示构建的镜像名称
  2. --output 的 push=true,表示构建镜像后推送到服务器
  3. 本地镜像仍然会存储在containerd的buildkit名字空间下

使用缓存构建镜像并推送到registry

buildctl build \
    --frontend=dockerfile.v0 \
    --local context=. \
    --local dockerfile=. \
    --output type=image,name=docker.io/username/image:tag,push=true
    --export-cache type=inline

注意:

  1. --export-cache 的 type=inline 表示把缓存放到镜像里,一起推送到registry
  2. 加上此参数后,似乎构建和推送的速度都并没有更快, 可能我还没有透彻理解, 等有空再看看
  3. --export-cache 还有两种type,暂时未做尝试
  4. 还有--import-cache的参数,暂时也未作尝试

镜像大小

以目前短暂的经验,buildkit构建的镜像一般至少会比Docker构建的镜像小10% , 最多的会小50% 多.

与[转帖]用buildkit和containerd构建镜像相似的内容:

[转帖]用buildkit和containerd构建镜像

https://zhuanlan.zhihu.com/p/366671300 最近因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://gith

[转帖]用buildkit和containerd构建镜像

https://zhuanlan.zhihu.com/p/366671300 最近因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://gith

[转帖]用了这18种方案,接口性能提高了100倍!

https://juejin.cn/post/7167153109158854687 前言 大家好,我是捡田螺的小男孩。 之前工作中,遇到一个504超时问题。原因是因为接口耗时过长,超过nginx配置的10秒。然后 真枪实弹搞了一次接口性能优化,最后接口从11.3s降为170ms。本文将跟小伙伴们分

[转帖]用bat更改hosts文件批处理

原文地址: https://www.jb51.net/article/51902.htm copy@echo off echo "请注意你的杀毒软件提示,一定要允许" @echo ######################################## @xcopy C:\Windows\s

[转帖]用sysbench压测mysql、postgresql(蟑螂db)对比

mysql: 准备创建表和数据: sysbench --db-driver=mysql --time=10 --threads=10 --report-interval=1 --mysql-host=172.18.44.84 --mysql-port=7999 --mysql-user=zl --m

[转帖]用sysbench进行数据库OLTP基准测试

https://www.cnblogs.com/ariesblog/p/13847740.html 基于TPC-C的OLTP基准测试,对比Mysql和PostgreSQL的性能 一、什么是TPC-C和tpmC 1、TPC-C TPC-C是一种旨在衡量联机事务处理(OLTP)系统性能与可伸缩性的行业标

[转帖]用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

https://www.zhihu.com/people/javajia-gou-ji-zhu-44/posts JDK命令行工具 在JDK的开发包中,除了大家熟知的java.exe和javac.exe外,还有一系列辅助工具。这些辅助工具位于JDK安装目录下的bin目录中,可以帮助开发人员很好地解决

【转帖】用pycharm开发django项目示例

https://www.cnblogs.com/kylinlin/p/5184592.html pycharm开发django工程(一) 在pycharm(企业版)中新建Django工程,注意使用虚拟环境 创建成功后,在pycharm显示的工程目录结构如下: 打开pycharm的Terminal,进

[转帖]如何用Perf解开服务器消耗的困境

https://rdc.hundsun.com/portal/article/637.html 无论是网站还是软件产品,服务器作为资源池,其重要性不言而喻。监控并了解服务器资源的消耗情况更是能将众多问题防范于未然,也许,一般的监控对于业内人基本不是问题,那让我们聊聊秘密武器Perf,你也许会有恍然大

[转帖]宋宝华:用eBPF/bcc分析系统性能的一个简单案例

原创 宋宝华 Linux阅码场 3月8日 bcc是eBPF的一种前端,当然这个前端特别地简单好用。可以直接在python里面嵌入通过C语言写的BPF程序,并帮忙产生BPF bytecode和load进入kernel挂载kprobe、tracepoints等上面执行。之后,还可以从python取出来C