containerd + nerdctl + buildkit 实现docker cli 和 docker-compose 功能

自从 Containerd 发布 1.5 以后,Kubernetes 的CRI接口使用 Containerd 来替代 dockershim 时, 我们便可以使用 nerdctl 工具(替代 docker cli) 配合 Containerd 的情况下基本已经可以替换掉 Docker 和 Docker Compose 。只有 nerdctl 还不能打包镜像,还需要 BuildKit 服务配置完成打包镜像

containerd

安装 containerd 服务,请参考 containerd安装 文章

nerdctl

nerdctl 是 与 Docker 兼容的CLI for Containerd,其支持Compose、Rootless、eStargz、OCIcrypt和IPFS,与docker命令行语法类似,所以其上手使用非常简单。项目地址 (https://github.com/containerd/nerdctl) 开源

注意:nerdctl 默认操作的是 default 命名空间

下载nerdctl包

sudo curl -SLo /usr/local/src/nerdctl-1.7.4-linux-amd64.tar.gz https://github.com/containerd/nerdctl/releases/download/v1.7.4/nerdctl-1.7.4-linux-amd64.tar.gz

复制二进制文件

sudo mkdir -p /opt/nerdctl
sudo tar xf /usr/local/src/nerdctl-1.7.4-linux-amd64.tar.gz -C /opt/nerdctl
sudo cp /opt/nerdctl/nerdctl /usr/local/bin
sudo rm -rf /opt/nerdctl

buildkit

BuildKit 是下一代的镜像构建组件,在 https://github.com/moby/buildkit 开源。

BuildKit 特性如下:

  • 自动垃圾收集
  • 可扩展的前端格式
  • 并发依赖项解析
  • 高效的指令缓存
  • 构建缓存导入/导出
  • 嵌套的构建作业调用
  • 可配置的构建底层,包括 OCI (runc)和 containerd,未来将加入更多的构建底层
  • 多种输出格式
  • 可插拔架构
  • 无需 root 权限

下载buildkit包

curl -SLo /usr/local/src/buildkit-v0.10.5.linux-amd64.tar.gz https://github.com/moby/buildkit/releases/download/v0.10.5/buildkit-v0.10.5.linux-amd64.tar.gz

复制二进制文件

sudo mkdir -p /opt/buildkit
sudo tar xf /usr/local/src/buildkit-v0.10.5.linux-amd64.tar.gz -C /opt/buildkit
sudo cp /opt/buildkit/bin/{buildkitd,buildctl} /usr/local/bin
sudo rm -rf /opt/buildkit

创建system服务

# buildkitd 的 system 的文件
cat <<-EOF | sudo tee /lib/systemd/system/buildkitd.service >> /dev/null
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
# Requires=buildkit.socket
After=buildkit.socket

[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true

[Install]
WantedBy=multi-user.target
EOF

# buildkitd 服务依赖的 socket 文件
cat <<-EOF | sudo tee /lib/systemd/system/buildkit.socket >> /dev/null
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

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

[Install]
WantedBy=sockets.target
EOF

启动服务

sudo systemctl daemon-reload    
sudo systemctl start buildkitd.service
sudo systemctl enable buildkitd.service  

设置别名

alias docker=nerdctl  
alias docker-compose="nerdctl compose"

持久化请将配置写入 ~/.bashrc 文件中。

测试功能

docker build

docker build --build-arg VERSION=2.2.7 -t keepalived:2.2.7 .
docker images keepalived:2.2.7

img

img

docker-compose

docker-compose up -d
docker-compose ps

img

img

报错信息提示以下:
FATA[0000] needs CNI plugin "bridge" to be installed in CNI_PATH ("/opt/cni/bin"), see https://github.com/containernetworking/plugins/releases: exec: "/opt/cni/bin/bridge": stat /opt/cni/bin/bridge: no such file or directory

解决方案

curl -SL -o /usr/local/src/cni-plugins-linux-amd64-v1.1.1.tgz https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
mkdir -p /opt/cni/bin
tar xf /usr/local/src/cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin
posted @   jiaxzeng  阅读(474)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示