1
2
3
4
5
作者:李晓辉

微信联系:lxh_chat

联系邮箱: 939958092@qq.com

在容器化技术的世界里,Docker曾一度是炙手可热的选择,其简单易用的命令行工具和强大的生态系统使其成为开发和运维的常用工具。然而,随着容器技术的发展,行业需求变得更加复杂和多样化,出现了对更高效、灵活和低层次的容器运行时的需求。这时,Containerd作为一种新选择,逐渐走入了人们的视野。

Containerd是一个高性能的容器运行时,它最初是Docker引擎的一部分,但后来被独立出来,成为一个CNCF(云原生计算基金会)项目。相比于Docker,Containerd提供了更简洁、更直接的容器管理接口,其轻量级设计和优秀的性能表现,使其成为 Kubernetes 等现代容器编排系统的理想选择。

而且,在现在Kubernetes不再直接维护docker的shim,使得Kubernetes和Docker的对接变的麻烦且低性能,现在掌握Containerd的使用变的尤为必要。

在这篇博客中,我们将深入探讨如何部署Containerd,并介绍其一些基本的使用方法,以帮助你快速上手并充分利用其优势。

Containerd 部署

Containerd的下载和安装

这里采用了2.0.1版本

1
2
wget https://github.com/containerd/nerdctl/releases/download/v2.0.1/nerdctl-full-2.0.1-linux-amd64.tar.gz
tar Cxzvvf /usr/local nerdctl-full-2.0.1-linux-amd64.tar.gz

生成配置文件

  1. 手工修改sanbox镜像到国内,不然它默认连接海外,而我们国内的网络连不上,会导致异常
  2. 如果你有现成的容器镜像加速器,可以配置一下registry部分,如果你没有,可以从这里购买容器镜像加速器: https://registry.credclouds.com
1
2
3
4
5
6
7
8
9
10
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
...
[plugins.'io.containerd.cri.v1.images'.pinned_images]
sandbox = 'registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10'
...
[plugins.'io.containerd.cri.v1.images'.registry]
config_path = '/etc/containerd/certs.d'
...

以上需要手工修改config.toml文件,容易写错,可以考虑用下面的方式自动完成修改

1
2
3
4
5
6
7
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
#沙盒镜像改为国内
sed -i '/^\s*\[plugins.'"'"'io.containerd.cri.v1.images'"'"'.pinned_images\]/{n;s|^\(\s*\)sandbox = .*$|\1sandbox = '"'"'registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10'"'"'|}' /etc/containerd/config.toml

#添加加速器地址
sed -i '/^\s*\[plugins.'"'"'io.containerd.cri.v1.images'"'"'.registry\]/{n;s|^\(\s*\)config_path = .*$|\1config_path = '"'"'/etc/containerd/certs.d'"'"'|}' /etc/containerd/config.toml

使用镜像加速器

如果你没有容器镜像加速器,就忽略这个小节,也可以打开这个页面购买一个: https://registry.credclouds.com

注意将你的加速器地址替换掉下面的xxx

1
2
3
4
5
mkdir /etc/containerd/certs.d/_default/ -p
cat > /etc/containerd/certs.d/_default/hosts.toml <<-'EOF'
[host."https://xxx.xxx.xxx"]
capabilities = ["pull", "resolve", "push"]
EOF

启动Containerd服务

1
2
3
systemctl daemon-reload
systemctl enable --now containerd
systemctl enable --now buildkit

添加nerdctl命令自动补齐功能

1
2
nerdctl completion bash > /etc/bash_completion.d/nerdctl
source /etc/bash_completion.d/nerdctl

Containerd 基本使用

运行容器

如果你没有配置以上的容器镜像加速器,这里将不会运行成功,因为国内的网络连不上dockerhub

1
2
nerdctl run -d -p 8000:80 --name container1 nginx
nerdctl ps

输出

1
2
CONTAINER ID    IMAGE                                                   COMMAND                   CREATED           STATUS    PORTS                   NAMES
1353d09a9df3 nginx:latest "/docker-entrypoint.…" 21 seconds ago Up 0.0.0.0:8000->80/tcp container1

-d 是指后台运行

-p 是端口映射,此处是将宿主机的8000端口和容器内的80端口映射到一起

–name 是指容器的名字

nginx 是指本次使用的镜像名字

进入容器

1
2
3
nerdctl exec -it container1 /bin/bash
root@1353d09a9df3:/# echo hello lixiaohui > /usr/share/nginx/html/index.html
root@1353d09a9df3:/# exit

exec -it 是指通过交互式进入terminal

访问容器内容

1
2
curl http://127.0.0.1:8000
hello lixiaohui

经过测试发现containerd工作正常