Containerd 的技术方向和目标
- 简洁的基于 gRPC 的 API 和 client library
- 完整的 OCI 支持(runtime 和 image spec)
- 同时具备稳定性和高性能的定义良好的容器核心功能
- 一个解耦的系统(让 image、filesystem、runtime 解耦合),实现插件式的扩展和重用
为什么需要独立的 containerd:
- 以往隶属于docker项目中,现如今从整体 docker 引擎中分离出的项目(开源项目的思路)
- 可以被 Kubernets CRI 等项目使用(通用化)
- 为广泛的行业合作打下基础(就像 runC 一样)
containerd的架构设计图:

安装containerd
验证仓库版本:
| root@containerd:~ apt-cache madison containerd |

ubuntu在线仓库版本不是最新,可以使用github仓库中的新版本,使用二进制方式部署
下载二进制安装包
github链接地址:https://github.com/containerd/containerd/releases
选择64位x86架构系统安装包

上传安装包到服务器并开始解压安装

解压缩并将containerd执行文件放入系统默认命令路径下
| root@containerd:/tools tar xf containerd-1.6.6-linux-amd64.tar.gz | |
| root@containerd:/tools cp -r bin/* /usr/local/bin/ |

创建containerd systemd service启动管理文件:
修改ExecStart=/usr/local/bin/containerd为当前containerd文件路径
| root@containerd:/tools cd /etc/systemd/system/ | |
| root@containerd:/etc/systemd/system# cat 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/local/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 |
重新加载系统管理服务文件
| root@containerd:/etc/systemd/system# systemctl daemon-reload |
创建配置文件
| root@containerd:/etc/systemd/system# mkdir /etc/containerd |
生成模板配置文件
| root@containerd:/etc/systemd/system# containerd config default > /etc/containerd/config.toml |

修改配置文件
| root@containerd:/etc/systemd/system# cd /etc/containerd/ | |
| root@containerd:/etc/containerd# vim config.toml |
vim下搜索/mirrors,添加镜像加速,使用docker镜像源即可,上下级配置,缩进两个空格。
| [plugins."io.containerd.grpc.v1.cri".registry.mirrors] | |
| [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] | |
| endpoint = ["https://dxc7f1d6.mirror.aliyuncs.com"] |
如果是从docker.io下载进行,则使用endpoint配置的镜像站点加速下载

启动containerd并设置开机自启动
| root@containerd:/etc/containerd# systemctl enable containerd --now |


安装runc
github下载链接:https://github.com/opencontainers/runc/releases
下载最新版本

上传到服务器

| root@containerd:/tools# chmod +x runc.amd64 | |
| root@containerd:/tools# cp runc.amd64 /usr/local/bin/runc |
验证使用containerd
containerd是ctrl工具在服务器上创建、管理和使用容器
| root@containerd:~# ctr --help | |
| NAME: | |
| ctr - | |
| __ | |
| _____/ /______ | |
| / ___/ __/ ___/ | |
| / /__/ /_/ / | |
| \___/\__/_/ | |
| containerd CLI | |
| USAGE: | |
| ctr [global options] command [command options] [arguments...] | |
| VERSION: | |
| v1.6.6 | |
| DESCRIPTION: | |
| ctr is an unsupported debug and administrative client for interacting | |
| with the containerd daemon. Because it is unsupported, the commands, | |
| options, and operations are not guaranteed to be backward compatible or | |
| stable from release to release of the containerd project. | |
| COMMANDS: | |
| plugins, plugin provides information about containerd plugins | |
| version print the client and server versions | |
| containers, c, container manage containers | |
| content manage content | |
| events, event display containerd events | |
| images, image, i manage images | |
| leases manage leases | |
| namespaces, namespace, ns manage namespaces | |
| pprof provide golang pprof outputs for containerd | |
| run run a container | |
| snapshots, snapshot manage snapshots | |
| tasks, t, task manage tasks | |
| install install a new package | |
| oci OCI tools | |
| shim interact with a shim directly | |
| help, h Shows a list of commands or help for one command | |
| GLOBAL OPTIONS: | |
| --debug enable debug output in logs | |
| --address value, -a value address for containerd's GRPC server (default: "/run/containerd/containerd.sock") [$CONTAINERD_ADDRESS] | |
| --timeout value total timeout for ctr commands (default: 0s) | |
| --connect-timeout value timeout for connecting to containerd (default: 0s) | |
| --namespace value, -n value namespace to use with commands (default: "default") [$CONTAINERD_NAMESPACE] | |
| --help, -h show help | |
| --version, -v print the version |
拉取镜像
与docker区别在于拉取官方镜像必须指定镜像的完整名称包括镜像仓库地址
| root@containerd:~# ctr images pull docker.io/library/nginx:latest |

查看本地的镜像
| root@containerd:~# ctr images ls |

运行容器
| root@containerd:~# ctr run -t docker.io/library/nginx:latest container1 bash |

container客户端工具
客户端工具有两种,分别是crictl和nerdctl
推荐使用nerdctl,使用效果与docker命令的语法一致
github下载链接:https://github.com/containerd/nerdctl/releases
下载安装nerdctl

解压安装nerdctl

拷贝nerdctl到系统二进制命令路径下
| root@containerd:/tools# cp nerdctl /usr/local/bin/ |
验证版本

查看nerdctl使用帮助,与docker客户端工具使用方法基本一致
| root@containerd:~# nerdctl --help | |
| nerdctl is a command line interface for containerd | |
| Config file ($NERDCTL_TOML): /etc/nerdctl/nerdctl.toml | |
| Usage: | |
| nerdctl [flags] | |
| nerdctl [command] | |
| Management commands: | |
| apparmor Manage AppArmor profiles | |
| builder Manage builds | |
| container Manage containers | |
| image Manage images | |
| ipfs Distributing images on IPFS | |
| namespace Manage containerd namespaces | |
| network Manage networks | |
| system Manage containerd | |
| volume Manage volumes | |
| Commands: | |
| build Build an image from a Dockerfile. Needs buildkitd to be running. | |
| commit Create a new image from a container's changes | |
| completion Generate the autocompletion script for the specified shell | |
| compose Compose | |
| cp Copy files/folders between a running container and the local filesystem. | |
| create Create a new container. Optionally specify "ipfs://" or "ipns://" scheme to pull image from IPFS. | |
| events Get real time events from the server | |
| exec Run a command in a running container | |
| help Help about any command | |
| history Show the history of an image | |
| images List images | |
| info Display system-wide information | |
| inspect Return low-level information on objects. | |
| kill Kill one or more running containers | |
| load Load an image from a tar archive or STDIN | |
| login Log in to a Docker registry | |
| logout Log out from a Docker registry | |
| logs Fetch the logs of a container. Currently, only containers created with `nerdctl run -d` are supported. | |
| pause Pause all processes within one or more containers | |
| port List port mappings or a specific mapping for the container | |
| ps List containers | |
| pull Pull an image from a registry. Optionally specify "ipfs://" or "ipns://" scheme to pull image from IPFS. | |
| push Push an image or a repository to a registry. Optionally specify "ipfs://" or "ipns://" scheme to push image to IPFS. | |
| rename rename a container | |
| restart Restart one or more running containers | |
| rm Remove one or more containers | |
| rmi Remove one or more images | |
| run Run a command in a new container. Optionally specify "ipfs://" or "ipns://" scheme to pull image from IPFS. | |
| save Save one or more images to a tar archive (streamed to STDOUT by default) | |
| start Start one or more running containers | |
| stats Display a live stream of container(s) resource usage statistics. | |
| stop Stop one or more running containers | |
| tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE | |
| top Display the running processes of a container | |
| unpause Unpause all processes within one or more containers | |
| update Update one or more running containers | |
| version Show the nerdctl version information | |
| wait Block until one or more containers stop, then print their exit codes. | |
| Flags: | |
| -H, --H string Alias of --address (default "/run/containerd/containerd.sock") | |
| -a, --a string Alias of --address (default "/run/containerd/containerd.sock") | |
| --address string containerd address, optionally with "unix://" prefix [$CONTAINERD_ADDRESS] (default "/run/containerd/containerd.sock") | |
| --cgroup-manager string Cgroup manager to use ("cgroupfs"|"systemd") (default "cgroupfs") | |
| --cni-netconfpath string cni config directory [$NETCONFPATH] (default "/etc/cni/net.d") | |
| --cni-path string cni plugins binary directory [$CNI_PATH] (default "/opt/cni/bin") | |
| --data-root string Root directory of persistent nerdctl state (managed by nerdctl, not by containerd) (default "/var/lib/nerdctl") | |
| --debug debug mode | |
| --debug-full debug mode (with full output) | |
| -h, --help help for nerdctl | |
| --host string Alias of --address (default "/run/containerd/containerd.sock") | |
| --hosts-dir strings A directory that contains <HOST:PORT>/hosts.toml (containerd style) or <HOST:PORT>/{ca.cert, cert.pem, key.pem} (docker style) (default [/etc/containerd/certs.d,/etc/docker/certs.d]) | |
| --insecure-registry skips verifying HTTPS certs, and allows falling back to plain HTTP | |
| -n, --n string Alias of --namespace (default "default") | |
| --namespace string containerd namespace, such as "moby" for Docker, "k8s.io" for Kubernetes [$CONTAINERD_NAMESPACE] (default "default") | |
| --snapshotter string containerd snapshotter [$CONTAINERD_SNAPSHOTTER] (default "overlayfs") | |
| --storage-driver string Alias of --snapshotter (default "overlayfs") | |
| -v, --version version for nerdctl | |
| Use "nerdctl [command] --help" for more information about a command. |
查看镜像、容器:

拉取镜像:

安装cni网络插件
CNI:Container network interface容器网络接口,为容器分配ip地址网卡等
github链接:
| https://github.com/containernetworking/plugins/releases |

下载安装cni,并解压到/usr/local/cni/bin目录下
| root@containerd:/tools# mkdir /opt/cni/bin -p | |
| root@containerd:/tools# tar xf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin/ |
查看解压后的cni插件文件:

注意:必须将cni解压到/opt/cni/bin,否则nerdctl为容器映射端口时,会出现找不到cni插件的报错
| root@containerd:~# nerdctl run -d -p 80:80 --name=web --restart=always nginx:latest | |
| FATA[0000] needs CNI plugin "bridge" to be installed in CNI_PATH ("/opt/cni/bin"), see https://github.com/con stat /opt/cni/bin/bridge: no such file or directory |

验证:使用nerdctl运行一个容器

宿主机访问容器映射到宿主机80端口
