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 命令把

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes 搜索推荐 数据安全/隐私保护
Containerd ctr、crictl、nerdctl 实战
Containerd ctr、crictl、nerdctl 实战
5264 1
|
Kubernetes 搜索推荐 Linux
Containerd容器镜像管理
Containerd容器镜像管理
|
存储 Java API
最佳镜像搬运工 Skopeo 指南(2)
最佳镜像搬运工 Skopeo 指南(2)
|
Kubernetes 容器 Perl
【kubernetes】解决: kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = faile...
【kubernetes】解决: kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = faile...
17988 0
|
应用服务中间件 nginx Docker
配置Containerd运行时镜像加速器
containerd配置国内容器镜像加速器
4825 1
|
搜索推荐 容器
containerd环境搭建指南
关于如何搭建containerd环境的详细指南,包括通过yum和二进制方式安装containerd的步骤,以及安装和配置runc的必要性。
2390 3
containerd环境搭建指南
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
4698 11
|
存储 Docker 容器
containerd容器运行时快速入门使用指南
关于containerd容器运行时的快速入门使用指南,涵盖了镜像管理、容器管理、NameSpace管理、数据持久化、镜像推送至Harbor仓库以及Docker与Containerd集成等内容。
1789 1
containerd容器运行时快速入门使用指南
|
JSON Kubernetes 数据格式
crictl 常见的命令大全
crictl(Container Runtime Interface Command Line Interface)是一个命令行工具,用于与符合Kubernetes容器运行时接口(CRI)规范的容器运行时进行交互。它提供了一系列命令来查看和管理容器、镜像、Pod等资源。以下是crictl的一些常见命令及其功能概述: ### 1. 镜像管理 * **查看镜像**: - `crictl images`:列出所有镜像。 - `crictl images | grep <image-name>`:查看特定镜像。 * **拉取镜像**: - `crictl pull <image_na
6288 9
|
Kubernetes Ubuntu 搜索推荐
containerd配置HTTP私仓
在240个字符内,以下是摘要: 在Ubuntu 22.04上,配置K8S基础环境后,安装Docker并设置镜像加速,接着部署私有的Harbor仓库(HTTP访问)。要将镜像推送到Harbor,需编辑Docker的`daemon.json`加入不安全注册表,然后重启服务。通过`docker login`、`docker tag`和`docker push`推送到Harbor。此外,配置`containerd`以信任Harbor的HTTP地址,更新`/etc/containerd/certs.d/`,重启服务后,使用`ctr`拉取和推送镜像至Harbor。
containerd配置HTTP私仓

热门文章

最新文章