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

简介: 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
随后就可以跟 docker 命令一样去查看容器和镜像了

配置 nerdctl 参数自动补齐

参数自动补齐,需要系统已经安装了 bash-completion.noarch 工具
echo 'source <(nerdctl completion bash)' >> /etc/profile
# 重新加载 /etc/profile 文件
source /etc/profile

nerdctl 命令验证

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

下载镜像

nerdctl -n k8s.io image pull centos:7
ctr 命令验证
ctr -n k8s.io image ls

nerdctl 完整版使用方法

  • 用完整版是为了可以使用 nerdctl build 命令,而 nerdctl build 命令其实时使用了 buildctl 命令来构建镜像
  • 完整版的 lib 目录下有现成的 buildkit.service 文件,不过需要注意 buildkitd 命令的路径,文件内默认的路径是 /usr/local/bin/buildkitd,需要把二进制文件放到指定路径下,或者修改文件的默认路径
cp lib/systemd/system/buildkit.service /lib/systemd/system/
  • 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

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"]
构建镜像
nerdctl build -t alpine:3.16.3-test .
使用 buildctl 命令构建镜像
buildctl build --frontend dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--output type=image,name=alpine:3.16.3-buildctl
  • --frontend - 使用 dockerfile.v0 作为前端,还有 gateway.v0 可以作为前端
  • --local context= - Dockerfile 执行构建时的路径上下文,比如在从目录中拷贝文件到镜像里
  • --local dockerfile= - Dockerfile 文件所在路径
  • --output name= - 构建后的镜像名称

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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
9月前
|
Java 持续交付 Docker
Docker 项目如何使用 Dockerfile 构建镜像?
Docker 简介:讲述 Docker 的起源、它是如何革新现代软件开发的,以及它为开发者和运维团队带来的好处。重点强调 Docker 的轻量级特性和它在提高应用部署、扩展和隔离方面的优势。
196 0
|
9月前
|
Docker 容器
docker build -t和docker build -f区别
参数用于指定要使用的Dockerfile的路径,允许你在不同的位置使用不同的Dockerfile来构建镜像。
149 0
|
9月前
|
JavaScript Java Docker
使用 Dockerfile 构建和定制 Docker 镜像
Dockerfile是构建Docker镜像的文本文件,包含一系列指令,如`FROM`, `WORKDIR`, `COPY`, `RUN`, `EXPOSE`和`CMD`。它用于自动化`docker build`命令来创建Image。使用Dockerfile可以基于官方镜像定制应用镜像,方便应用容器化和扩展。基本流程包括选择基础镜像、设置工作目录、安装依赖、暴露端口和定义启动命令。构建镜像使用`docker build`,运行容器用`docker run`。了解并熟练使用Dockerfile能提升容器化部署效率。
|
9月前
|
Docker Python 容器
Docker 镜像添加模块
Docker 镜像添加模块
120 0
Docker 镜像添加模块
|
9月前
|
网络协议 Java Shell
docker镜像构建之Dockerfile
docker镜像构建之Dockerfile
85 0
|
Java Maven Docker
Maven构建Docker镜像
Maven构建Docker镜像
177 0
|
网络协议 Java 数据建模
docker-maven-plugin:自动构建Maven多模块的Docker镜像,并推送到Docker Registry或阿里云
docker-maven-plugin:自动构建Maven多模块的Docker镜像,并推送到Docker Registry或阿里云
3400 0
docker-maven-plugin:自动构建Maven多模块的Docker镜像,并推送到Docker Registry或阿里云
|
开发框架 .NET Linux
基于 Alpine 环境构建 aspnetcore6-runtime 的 Docker 镜像
apline linux 环境,构建 asp.net core 应用程序的基础镜像。--- The glow of a firefly may be faint, but when it shines, it challenges the darkness.
649 1
|
Linux Shell Docker
docker--Dockerfile、构建 python 镜像
docker--Dockerfile、构建 python 镜像
|
弹性计算 Java jenkins
Gradle从0入门到实战系列【十】集成Dockerfile构建Docker镜像
在工作中,我们会将SpringBoot程序打包成Docker镜像,这就需要在Gradle中配置Dockerfile构建程序,并且能将打包后的镜像部署并启动为一个容器,Gradle的插件能够帮我们完成这件事
1292 0
Gradle从0入门到实战系列【十】集成Dockerfile构建Docker镜像