更新时间:2022年12月10日
文章目录
- 简介
- DNF/APT 安装
- DNF 安装
- 准备
- 安装
- APT 安装
- 准备
- 安装
- 二进制安装(推荐)
- 准备
- 安装 containerd
- 安装 runc
- 安装 CNI 插件
- 验证
- containerd 配置
- containerd 客户端工具
- 对比
- `ctr`
- 示例
- `crictl`
- 安装
- 配置
- 示例
- `nerdctl`(推荐使用)
- 安装
- 示例
官网:containerd
Containerd 是工业级的容器运行时,是从 Docker 中分离出来的底层容器运行时。相比较于 Docker,其设计目的主要是为了嵌入到一个更大的系统中(一般嵌入到Kubernetes),而不是直接由开发人员或终端用户使用
组件构成
Containerd 正常使用需要包含以下几个组件:
containerd
:主体程序runc
:容器运行时CNI pulgins
:网络相关插件,提供实现了 CNI 协议的接口安装方式
Containerd 在 Linux 上安装方式主要有以下两种
.deb
和 .rpm
,containerd.io
包同时包含 runc
,但不包含 CNI
插件)安装方法参考
主机列表
主机名 | 操作系统 | IP |
---|---|---|
contanerd | Rocky Linux release 8.7 (Green Obsidian) | 192.168.111.181 |
清除原有的软件
如果过去安装过 docker 或者 containerd,需要先卸载
$ dnf remove -y docker-ce docker-ce-cli containerd.io
推荐安装的依赖
device-mapper-persistent-data
:Linux 2.6 内核中支持逻辑卷管理的通用设备映射机制(RockyLinux 8 内核为 4.18,可以不安装)lvm2
:逻辑卷管理工具(RockyLinux 8 系统默认有安装)$ dnf install -y device-mapper-persistent-data lvm2
下载仓库文件(CentOS/RHEL)
$ curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
替换仓库为国内源
官方源在国内访问速度较慢,可以替换为国内源(此处列举<清华源>和<阿里源>,选一即可)
# 替换软件仓库为 TUNA
$ sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 替换软件仓库为 ali
$ sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
更新缓存
$ dnf makecache
**安装最新稳定版本 **
# 安装 containerd.io latest stable(最新稳定)版本
$ dnf install -y containerd.io
安装指定版本
# 查看版本
$ dnf list containerd.io.x86_64 --showduplicates | sort -r
Last metadata expiration check: 0:23:50 ago on Sun 11 Dec 2022 09:21:33 PM EST.
containerd.io.x86_64 1.6.9-3.1.el8 docker-ce-stable
containerd.io.x86_64 1.6.8-3.1.el8 docker-ce-stable
containerd.io.x86_64 1.6.7-3.1.el8 docker-ce-stable
containerd.io.x86_64 1.6.6-3.1.el8 docker-ce-stable
containerd.io.x86_64 1.6.4-3.1.el8 docker-ce-stable
containerd.io.x86_64 1.6.12-3.1.el8 docker-ce-stable
containerd.io.x86_64 1.6.11-3.1.el8 docker-ce-stable
containerd.io.x86_64 1.6.10-3.1.el8 docker-ce-stable
containerd.io.x86_64 1.5.11-3.1.el8 docker-ce-stable
containerd.io.x86_64 1.5.10-3.1.el8 docker-ce-stable
containerd.io.x86_64 1.4.9-3.1.el8 docker-ce-stable
.......
# 安装指定版本 dnf -y install containerd.io-[VERSION].[架构]
$ dnf -y install containerd.io-1.6.12-3.1.el8.x86_64
验证
验证安装的 containerd 版本
$ containerd -v
containerd containerd.io 1.6.12 a05d175400b1145e5e6a735a6710579d181e7fb0
验证安装的 runc 版本
$ runc -v
runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d
spec: 1.0.2-dev
go: go1.18.9
libseccomp: 2.5.2
查看 service 文件
$ cat /usr/lib/systemd/system/containerd.service
# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
安装方法参考
主机列表
主机 | 操作系统 | IP |
---|---|---|
contanerd | Ubuntu 22.04.1 LTS | 192.168.111.221 |
清理原有的软件
如果过去安装过 docker 或者 containerd,需要先卸载
$ sudo apt remove -y docker-ce docker-ce-cli containerd.io
安装依赖
ca-certificates
:证书管理工具(Ubuntu 22 默认已安装)gnupg2
:GNU Privacy Guard ( GnuPG 或 GPG ),是一种加密软件,有多个版本(Ubuntu 22 默认已安装 gnupg
)apt-transport-https
:使 apt 支持 httpssoftware-properties-common
:提供了 apt 的一些简便工具,例如:add-apt-repository
$ sudo apt -y install apt-transport-https ca-certificates software-properties-common gnupg2
配置仓库
此处使用了阿里云的镜像源
信任 Docker 的 GPG 公钥
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
添加软件仓库
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新缓存
$ apt update
安装最新稳定版本
$ sudo apt install -y containerd.io
安装指定版本
# 查找 containerd 版本
$ apt-cache madison containerd.io
containerd.io | 1.6.12-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io | 1.6.11-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io | 1.6.10-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io | 1.6.9-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io | 1.6.8-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io | 1.6.7-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io | 1.6.6-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io | 1.6.4-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io | 1.5.11-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io | 1.5.10-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
......
# 安装指定版本的 containerd: sudo apt-get -y install containerd.io=[VERSION]
# (VERSION 为上面的 5:19.03.15~3-0~ubuntu-focal)
sudo apt install -y containerd.io=1.6.12-1
验证
验证安装的 containerd 版本
$ containerd -v
containerd containerd.io 1.6.12 a05d175400b1145e5e6a735a6710579d181e7fb0
验证安装的 runc 版本
$ runc -v
runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d
spec: 1.0.2-dev
go: go1.18.9
libseccomp: 2.5.3
查看 service 文件
$ cat /usr/lib/systemd/system/containerd.service
# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
参考:containerd downloads
注:
containerd 的二进制版本适用于 amd64、arm64、ppc64le、riscv64 架构
二进制安装 containerd 还需要手动安装 runc 和 cni 插件
主机列表
主机 | 操作系统 | IP |
---|---|---|
contanerd | Rocky Linux release 8.7 (Green Obsidian) | 192.168.111.221 |
从官方 github 地址(https://github.com/containerd/containerd/releases)下载二进制安装包,格式: containerd-
。校验 sha256sum 无误后,解压到 /usr/local
目录
# 下载 containerd 二进制包
$ curl -LO https://github.com/containerd/containerd/releases/download/v1.6.12/containerd-1.6.12-linux-amd64.tar.gz
# 解压
$ tar Cxzvf /usr/local containerd-1.6.12-linux-amd64.tar.gz
bin/
bin/ctr
bin/containerd
bin/containerd-shim
bin/containerd-stress
bin/containerd-shim-runc-v2
bin/containerd-shim-runc-v1
containerd
二进制文件是为基于 glibc 的 Linux 发行版(例如 Ubuntu 和 Rocky Linux)动态构建的。所以此二进制文件可能无法在基于 musl 的发行版(如 Alpine Linux)上运行。此类发行版必须从源代码编译或第三方软件包安装 containerd
FAQ:对于 Kubernetes,需要下载
cri-containerd-(cni-)
吗?- .tar.gz Answer:不需要
由于 Kubernetes CRI 功能已经包含在
containerd-
中,所以不需要额外下载- - .tar.gz cri-containerd-(cni-)
也可以使用 CRI 接口功能- .tar.gz
cri-containerd-...
将在 containerd 2.0 中删除
配置 systemd
如果打算通过 systemd 启动 containerd,还需要下载 containerd.service
文件(https://raw.githubusercontent.com/containerd/containerd/main/containerd.service),放置到 /usr/local/lib/systemd/system/containerd.service
# 创建目录
$ mkdir -p /usr/local/lib/systemd/system/
# 下载 service 文件
$ curl -o /usr/local/lib/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
# 重新加载 service 文件
$ systemctl daemon-reload
从 runc 的官方 github (https://github.com/opencontainers/runc/releases)下载 runc 二进制文件,格式:runc.
。校验 sha256sum 无误后,安装到 /usr/local/sbin/runc
# 下载 runc
$ curl -LO https://github.com/opencontainers/runc/releases/download/v1.1.4/runc.amd64
# 安装 runc
$ install -m 755 runc.amd64 /usr/local/sbin/runc
runc
二进制文件是静态构建的,应该可以在任何 Linux 发行版上运行
从官方 github 地址(https://github.com/containernetworking/plugins/releases)下载 CNI 插件,格式:cni-plugins-
。校验 sha256sum 无误后,解压到目录 /opt/cni/bin
# 下载
$ curl -LO https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
# 创建目录
$ mkdir -p /opt/cni/bin
# 解压
$ tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz
cni
插件的二进制文件是静态构建的,应该可以在任何 Linux 发行版上运行
# 启动 containerd 并设置开机启动
$ systemctl enable --now containerd
验证安装的 containerd 版本
$ containerd -v
containerd containerd.io 1.6.12 a05d175400b1145e5e6a735a6710579d181e7fb0
验证安装的 runc 版本
$ runc -v
runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d1
spec: 1.0.2-dev
go: go1.17.10
libseccomp: 2.5.4
配置文件路径:/etc/containerd/config.toml
包管理器安装时,默认会生成配置文件,二进制安装则需要手动生成文件
生成配置文件
# 生成默认配置
$ mkdir -p /etc/containerd/
$ containerd config default > /etc/containerd/config.toml
# 设置 sandbox_image 镜像源为阿里云的 google_containers 镜像源
$ sed -ri "s#registry.k8s.io#registry.aliyuncs.com/google_containers#g" /etc/containerd/config.toml
# 修改 Systemdcgroup
$ sed -ri 's#(SystemdCgroup )= false#\1 = true#g' /etc/containerd/config.toml
# 添加镜像加速配置
$ sed -ri '/registry.mirrors]/a\ [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]' /etc/containerd/config.toml
$ sed -ri '/registry.mirrors."docker.io"]/a\ endpoint = ["https://sqr9a2ic.mirror.aliyuncs.com"]' /etc/containerd/config.toml
Name | Community | API | Target | Web site |
---|---|---|---|---|
ctr |
containerd | Native | For debugging only | (None, see ctr --help to learn the usage) |
nerdctl |
containerd (non-core) | Native | General-purpose | https://github.com/containerd/nerdctl |
crictl |
Kubernetes SIG-node | CRI | For debugging only | https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md |
ctr
ctr
作为 containerd
项目的一部分,是安装 containerd
时默认提供的命令行客户端,具有镜像和容器管理的简单功能
注:
ctr
操作镜像时,需填写完整路径
下载镜像
$ ctr images pull docker.io/library/redis:alpine
查看镜像
$ ctr images ls | awk -F' ' '{print $1,$2}'
REF TYPE
docker.io/library/redis:alpine application/vnd.docker.distribution.manifest.list.v2+json
运行容器
$ ctr run -d docker.io/library/redis:alpine redis
查看运行的容器
$ ctr containers ls
CONTAINER IMAGE RUNTIME
redis docker.io/library/redis:alpine io.containerd.runc.v2
$ ctr task ls
TASK PID STATUS
redis 11908 RUNNING
crictl
参考:使用 crictl 对 Kubernetes 节点进行调试 | Kubernetes
工具下载地址:kubernetes-sigs/cri-tools
文档:cri-tools/crictl.md
crictl
是遵循 CRI 接口规范的一个命令行工具,通常用它来检查和管理 kubernetes 节点上的容器运行时和镜像
注:
crictl
的所有操作均在k8s.io
这个 namespace 下
# 选择版本下载
$ export VERSION="v1.24.2"
$ curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-${VERSION}-linux-amd64.tar.gz --output crictl-${VERSION}-linux-amd64.tar.gz
# 解压
$ sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
$ rm -f crictl-$VERSION-linux-amd64.tar.gz
连接信息配置
Linux 下,crictl
默认会根据以下顺序来连接容器运行时,如果 sock 配置在其他路径或连接顺序有变化,可以通过 /etc/crictl.yaml
进行配置
unix:///var/run/dockershim.sock
unix:///run/containerd/containerd.sock
unix:///run/crio/crio.sock
unix:///var/run/cri-dockerd.sock
$ cat > /etc/crictl.yaml << EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 2
debug: false
pull-image-on-create: true
EOF
下载镜像
$ crictl pull alpine:3.17.0
查看镜像
$ crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/library/alpine 3.17.0 49176f190c7e9 3.37MB
nerdctl
(推荐使用)官方 github 地址:containerd/nerdctl
nerdctl
是一个相对较新的containerd
命令行客户端。与ctr
不同,nerdctl
的目标是对用户友好并且和 docker
兼容
依赖的插件
nerdctl
v1.1.0 或更高的版本需要通过 CNI 插件来控制网络(nerdctl network create
)nerdctl build
)。参考: the document about setting up BuildKit# 下载
$ curl -LO https://github.com/containerd/nerdctl/releases/download/v1.1.0/nerdctl-1.1.0-linux-amd64.tar.gz
# 解压
$ tar Cxzvf /usr/local/bin/ nerdctl-1.1.0-linux-amd64.tar.gz
下载镜像
$ nerdctl pull busybox:1.34.1-glibc
查看镜像
$ nerdctl -n "default" images
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
busybox 1.34.1-glibc 898fba644d17 22 minutes ago linux/amd64 4.7 MiB 2.5 MiB
运行容器
$ nerdctl run -it --name busybox busybox:1.34.1-glibc
/ #
查看正在运行的容器
$ nerdctl ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cea05bf4a6a5 docker.io/library/busybox:1.34.1-glibc "sh" 1 minutes ago Up busyboxS