介绍

containerd 是一个用于管理容器生命周期的开源容器守护程序,是 Docker 引擎中的核心组件之一。它负责容器的创建、启动、停止、销毁等操作,并提供了对容器的基本管理功能,如镜像管理、网络管理、存储管理等。与 Docker 引擎相比,containerd 更加轻量级,同时也支持多种容器运行时,如 runc、gVisor、Kata Containers 等。由于其简单、可扩展和可移植等优点,containerd 也成为了许多容器平台和工具的基础组件之一。

安装

本文只介绍 Linux 系统下的安装方式。 Linux 下的 deb 和 rpm 包 containerd.io 由 docker 官方进行分发,通过查阅官方文档,具体的安装步骤如下:

1 更新 apt 软件包索引并安装必要的软件包,以便 apt 能够使用 HTTPS 仓库。

1
2
3
4
5
6
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

2 添加 Docker’s 官方 GPG key:

1
2
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 设置存储库

1
2
3
4
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 安装

1
 sudo apt-get install containerd.io

5 查看版本

执行

1
2
3
4
 # 启动 containerd
 containerd
 # 查看 containerd 版本
 containerd -v
1
containerd containerd.io 1.6.16 31aa4358a36870b21a992d3ad2bef29e1d693bec

如果打印了相应的版本信息,就代表安装成功。

客户端初体验

目前有例如 ctr crictl 等客户端工具可以来操作 containerd ,我比较常用 crictl ,但本文不使用这2个工具,而是使用官方提供的简易客户端包来简单操作容器。

初始代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 的官方镜像并输出镜像名称,接下来我们来补充代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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 进行简单的分析,敬请期待。

参考