• containerd 镜像构建工具 -- nerdctl 和 buildkit


    自我介绍

    • kubernetes1.24 版本之后就要抛弃 docker-shim 组件,容器运行时也是从 docker 转换到了 containerd,而 containerd 自带的 ctr 命令并不好用,并且自身不支持构建镜像,并不像 docker 一样可以通过 docker build 来构建镜像
    • containerd 有一个子项目:nerdctl ,用来兼容 docker cli,可以像 docker 命令一样来管理本地的镜像和容器

    nerdctl github

    • wget 下载的时候,需要加上 --no-check-certificate 参数,不然可能会返回 Unable to establish SSL connection. 这样的报错
    • 精简版 10.22MB
      • 仅有 nerdctl 命令
        • 无法使用 nerdctl build 命令,执行 nerdctl build 会出现如下报错:
        • ERRO[0000] buildctl needs to be installed and buildkitd needs to be running
    • 完整版 221.6MB
      • 不仅有 netdctl 命令,还包含了 buildkitd buildctlctrrunccontainerd 相关的命令,以及 cni 插件的二进制文件

    nerdctl 精简版使用方法

    • 下载精简版二进制文件后,只需要把解压出来的文件放到 /usr/bin 目录下就可以了,当然有特殊需求,也可以解压到指定的路径,追加到 PATH 变量也可以
    • nerdctl 命令默认链接 containerd.sock 文件路径是 /run/containerd/containerd.sock ,如果和 containerd 配置文件内配置的 containerd.sock 不同,使用 nerdctl 命令的时候需要加上 -a 参数来指定 containerd.sock 路径
    tar xf nerdctl-1.0.0-linux-amd64.tar.gz -C /usr/bin
    
    • 1

    随后就可以跟 docker 命令一样去查看容器和镜像了

    配置 nerdctl 参数自动补齐

    参数自动补齐,需要系统已经安装了 bash-completion.noarch 工具

    echo 'source <(nerdctl completion bash)' >> /etc/profile
    # 重新加载 /etc/profile 文件
    source /etc/profile
    
    • 1
    • 2
    • 3
    nerdctl 命令验证

    containerddockerkubernetes 上使用的区别在于:containerd 作为容器运行时的情况下,需要把镜像放到 k8s.io 这个 namespace

    下载镜像

    nerdctl -n k8s.io image pull centos:7
    
    • 1

    ctr 命令验证

    ctr -n k8s.io image ls
    
    • 1

    nerdctl 完整版使用方法

    • 用完整版是为了可以使用 nerdctl build 命令,而 nerdctl build 命令其实时使用了 buildctl 命令来构建镜像
    • 完整版的 lib 目录下有现成的 buildkit.service 文件,不过需要注意 buildkitd 命令的路径,文件内默认的路径是 /usr/local/bin/buildkitd,需要把二进制文件放到指定路径下,或者修改文件的默认路径
    cp lib/systemd/system/buildkit.service /lib/systemd/system/
    
    • 1
    • buildkitd - buildkit 服务端命令
      • buildkitd 有两种可用的 worker,一个是 runc ,一个是 containerd ;默认使用 runc ,在 buildkitd 参数中为 oci-worker
        • 使用 containerd 作为 worker,需要增加 --oci-worker=false --containerd-worker=true 参数
          • nerdctl 命令一样,默认调用的是 /run/containerd/containerd.sock 文件,如果路径不一致,需要增加 --containerd-worker-addr 参数来指定 containerd.sock 文件的路径
          • 使用 containerd 作为 worker 时,会自动创建 buildkit 这个 namespace,可以通过 nerdctl namespace ls 命令来查看
            • 如果使用 nerdctl build 命令构建镜像,想把构建的镜像放到 buildkit 这个 namespace 下面,需要使用 nerdctl -n buildkit build 命令来指定 namespace
            • 如果使用 buildctl 命令构建镜像,会自动将构建好的镜像放到 buildkit 这个 namespace 下面
    • buildctl - buildkit 客户端命令
      • 执行 nerdctl build 需要保证 buildctl 命令在系统 PATH 环境变量中可查

    启动 buildkit

    systemctl enable buildkit.service --now
    
    • 1

    nerdcrtl 构建镜像

    简单写一个 Dockerfile 验证一下

    FROM alpine:3.16.3
    
    ENV LANG=en_US.UTF-8
    ENV TZ="Asia/Shanghai"
    
    RUN echo '/bin/sleep 315360000' > start.sh
    CMD ["sh","start.sh"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    构建镜像

    nerdctl build -t alpine:3.16.3-test .
    
    • 1

    使用 buildctl 命令构建镜像

    buildctl build --frontend dockerfile.v0 \
    --local context=. \
    --local dockerfile=. \
    --output type=image,name=alpine:3.16.3-buildctl
    
    • 1
    • 2
    • 3
    • 4
    • --frontend - 使用 dockerfile.v0 作为前端,还有 gateway.v0 可以作为前端
    • --local context= - Dockerfile 执行构建时的路径上下文,比如在从目录中拷贝文件到镜像里
    • --local dockerfile= - Dockerfile 文件所在路径
    • --output name= - 构建后的镜像名称

    挺麻烦的,我还是选择 nerdctl 命令把

    ######################################## 不华丽的分割线 ########################################

    自 2022-12-22 更新
    后续使用过程中发现了一些问题,使用 nerdctl 命令创建容器的时候,默认的 cni 插件路径是 /opt/cni/bin 目录,但是我部署的时候,cni 组件不在这个路径下,可以自己增加一个 alias 来指定路径

    alias nerdctl='nerdctl --cni-path /approot/data/k8s/bin/'
    
    • 1

    再次使用 nerdctl run 就不会报错找不到 cni 插件了,当然,这里的路径需要改成自己的 cni 插件的路径

  • 相关阅读:
    毅速3D打印:深骨位零件制造首选3D打印
    summer time~ schedule
    Springboot 项目读取yaml的配置文件信息给静态方法使用,以及通过配置 ResourceBundle 类读取config.properties
    AcWing第126场周赛 - 思维+字符串处理+递归
    『现学现忘』Git基础 — 5、Git的协作模式
    打表找规律与分析判断:ARC144C
    2023年华数杯数学建模A题隔热材料的结构优化控制研究解题全过程文档及程序
    项目进展(一)-晶振正常输出、焊接驱动芯片、查找芯片手册并学习
    flask后端进行yolov5检测模型的部署(填坑)
    fastapi_No.14_跨域资源共享
  • 原文地址:https://blog.csdn.net/u010383467/article/details/128068242