介绍
containerd 是一个用于管理容器生命周期的开源容器守护程序,是 Docker 引擎中的核心组件之一。它负责容器的创建、启动、停止、销毁等操作,并提供了对容器的基本管理功能,如镜像管理、网络管理、存储管理等。与 Docker 引擎相比,containerd 更加轻量级,同时也支持多种容器运行时,如 runc、gVisor、Kata Containers 等。由于其简单、可扩展和可移植等优点,containerd 也成为了许多容器平台和工具的基础组件之一。
安装
本文只介绍 Linux 系统下的安装方式。 Linux 下的 deb 和 rpm 包 containerd.io 由 docker 官方进行分发,通过查阅官方文档,具体的安装步骤如下:
1 更新 apt 软件包索引并安装必要的软件包,以便 apt 能够使用 HTTPS 仓库。
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
2 添加 Docker’s 官方 GPG key:
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
3 设置存储库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
4 安装
sudo apt-get install containerd.io
5 查看版本
执行
# 启动 containerd
containerd
# 查看 containerd 版本
containerd -v
containerd containerd.io 1.6.16 31aa4358a36870b21a992d3ad2bef29e1d693bec
如果打印了相应的版本信息,就代表安装成功。
客户端初体验
目前有例如 ctr
crictl
等客户端工具可以来操作 containerd ,我比较常用 crictl ,但本文不使用这2个工具,而是使用官方提供的简易客户端包来简单操作容器。
初始代码如下:
package main
import (
"log"
"github.com/containerd/containerd"
)
func main() {
if err := redisExample(); err != nil {
log.Fatal(err)
}
}
func redisExample() error {
client, err := containerd.New("/run/containerd/containerd.sock")
if err != nil {
return err
}
defer client.Close()
return nil
}
使用 containerd.New 根据 containerd 默认的套接字路径创建客户端连接,redisExample 函数的作用是拉取 redis 的官方镜像并输出镜像名称,接下来我们来补充代码。
package main
import (
"context"
"fmt"
"github.com/containerd/containerd/namespaces"
"log"
"github.com/containerd/containerd"
)
func main() {
if err := redisExample(); err != nil {
log.Fatal(err)
}
}
func redisExample() error {
client, err := containerd.New("/run/containerd/containerd.sock")
if err != nil {
return err
}
defer client.Close()
ctx := namespaces.WithNamespace(context.Background(), "redis")
image, err := client.Pull(ctx, "docker.io/library/redis:alpine", containerd.WithPullUnpack)
if err != nil {
return err
}
fmt.Println(image.Name())
return nil
}
使用 namespaces.WithNamespace 可以防止我们创建的一些容器镜像和其他用户起冲突,使用 client.Pull 拉取官方的 redis 镜像。
小结
本文我简单介绍了如何安装 containerd 和官方客户端的简单使用。后面文章我还会对 containerd 进行简单的分析,敬请期待。