containerd 架构及说明
容器技术已经成为现代软件开发和部署的核心工具。通过容器,开发者可以创建轻量级、便携的运行环境,从而简化应用程序的开发、测试和部署流程。在容器技术的生态系统中,容器运行时扮演着至关重要的角色。containerd 是一个高效、可靠的开源容器运行时,它被设计为从开发到生产环境的核心容器管理解决方案。containerd 的架构主要分为三个部分:生态系统(Ecosystem)、平台(Platform)和客户端(Client)。每个部分在整个系统中扮演着不同的角色,协同工作以提供全面的容器管理功能。
生态系统(Ecosystem)
containerd 的生态系统包括一系列与其集成的工具和组件,这些工具和组件扩展了 containerd 的功能并增强了其适用性。
CRI 插件:与 Kubernetes 紧密集成,通过实现 Container Runtime Interface (CRI),使 Kubernetes 能够管理容器。
CNI 插件:使用 Container Network Interface (CNI)插件进行网络管理,提供容器的网络连接。
CSI 插件:Container Storage Interface (CSI)插件用于存储管理,允许容器挂载和管理存储卷。
镜像管理:支持 Docker 镜像和 OCI 镜像规范,提供从镜像仓库拉取、存储和管理容器镜像的能力。
插件机制:允许通过插件扩展 containerd 的功能,满足特定的需求。
平台(Platform)
containerd 的平台层是整个系统的核心,负责管理和调度容器运行时的所有基本操作。这个层次的主要组件包括:
守护进程:containerd 守护进程负责处理所有的容器管理请求,并维护容器的生命周期。
gRPC API:通过 gRPC API 与外部客户端通信,提供标准化的接口以执行容器操作。
任务管理:管理容器的创建、启动、停止和删除任务,确保容器按照预期运行。
快照管理:使用快照(Snapshot)机制管理容器文件系统,实现高效的存储操作。
事件监控:实时监控容器事件,提供日志记录和事件通知功能,便于运维人员进行故障排查和系统监控。
客户端(Client)
containerd 的客户端提供用户与 containerd 平台交互的方式。主要的客户端工具包括:
ctr:containerd 自带的命令行工具,用于直接与 containerd 进行交互。虽然功能强大,但主要用于开发和调试场景。
crictl:专为 Kubernetes 设计的命令行工具,通过 CRI 接口与 containerd 进行交互,适用于 Kubernetes 集群的运维和管理。
nerdctl:一个 Docker 兼容的 CLI 工具,提供类似 Docker 的用户体验,使用户无需重新学习即可使用 containerd 管理容器。
containerd 安装
containerd 官网
containerd 安装
# 下载 containerd release 包 $ wget https://github.com/containerd/containerd/releases/download/v1.7.14/containerd-1.7.14-linux-amd64.tar.gz $ tar -zxvf cri-containerd-1.7.14-linux-amd64.tar.gz -C / # 生成 containerd 默认配置文件 $ mkdir /etc/containerd/ $ containerd congfig default > /etc/containerd/config.toml # 启动 containerd 服务 $ systemctl start containerd && systemctl enable containerd $ ctr version
containerd CLI工具
ctr、crictl、nerdctl常用命令
命令 | docker | ctr | crictl | nerdctl |
---|---|---|---|---|
查看运行的容器 | docker ps | ctr task ls/ctr container ls | crictl ps | nerdctl ps |
查看镜像 | docker images | ctr image ls | crictl images | nerdctl images |
查看容器日志 | docker logs | 无 | crictl logs | nerdctl logs |
查看容器数据信息 | docker inspect | ctr container info | crictl inspect | nerdctl inspect |
查看容器资源 | docker stats | 无 | crictl stats | nerdctl stats |
启动 / 关闭已有的容器 | docker start/stop | ctr task start/kill | crictl start/stop | nerdctl start/stop |
运行一个新的容器 | docker run | ctr run | 无(最小单元为 pod) | nerdctl run |
修改镜像标签 | docker tag | ctr image tag | 无 | nerdctl tag |
创建一个新的容器 | docker create | ctr container create | crictl create | nerdctl create |
导入镜像 | docker load | ctr image import | 无 | nerdctl import |
导出镜像 | docker save | ctr image export | 无 | nerdctl export |
删除容器 | docker rm | ctr container rm | crictl rm | nerdctl rm |
删除镜像 | docker rmi | ctr image rm | crictl rmi | nerdctl rmi |
拉取镜像 | docker pull | ctr image pull | crictl pull | nerdctl pull |
推送镜像 | docker push | ctr image push | 无 | nerdctl push |
在容器内部执行命令 | docker exec | ctr task exec | crictl exec | nerdctl exec |
ctr
定义和功能: ctr 是一个用于测试和调试 containerd 的轻量级 CLI 工具。它提供了一些基本的命令,可以用于快速验证 containerd 的功能。 使用场景及实例: ctr 主要用于开发和测试环境,例如开发者需要验证 containerd 是否正确安装和配置时,可以使用 ctr 运行一些基本的测试命令。
ctr 命令全集
全局选项
--address
或-a
: 指定 containerd 的 gRPC 服务器地址(默认:/run/containerd/containerd.sock
)。--connect-timeout
: 设置连接到 containerd 的超时时间(默认:0 秒)。--debug
: 启用调试输出。--namespace
或-n
: 指定要使用的命名空间(默认:default
)。--timeout
: 设置命令的超时时间(默认:0 秒)。
命令
plugins
list
或ls
: 列出 containerd 插件。--detailed
或-d
: 显示每个插件的详细信息。--quiet
或-q
: 只显示插件 ID。version
: 显示客户端和服务器版本。
containers
create
: 创建容器。--allow-new-privs
: 允许创建具有新特权的容器。--annotation
: 添加 OCI 注解。--apparmor-default-profile
: 启用 AppArmor 默认配置文件。--apparmor-profile
: 启用 AppArmor 自定义配置文件。--blockio-class
: 设置块 I/O 类别。--blockio-config-file
: 指定块 I/O 类别定义文件。--cap-add
: 添加 Linux 功能。--cap-drop
: 删除 Linux 功能。--config
: 指定运行时特定规范配置文件。--cpu-period
: 设置 CPU CFS 周期。--cpu-quota
: 设置 CPU CFS 配额。--cwd
: 设置工作目录。--device
: 添加设备。--env
: 设置环境变量。--env-file
: 从文件中设置环境变量。--gpus
: 添加 GPU。--hostname
: 设置主机名。--label
: 添加标签。--memory-limit
: 设置内存限制。--mount
: 添加挂载点。--net-host
: 启用主机网络。--no-pivot
: 禁用 pivot-root。--pid-file
: 设置 PID 文件路径。--privileged
: 创建特权容器。--rdt-class
: 设置 RDT 类别。--read-only
: 设置容器文件系统为只读。--rootfs
: 指定自定义根文件系统。--rootfs-propagation
: 设置容器根文件系统的传播方式。--runtime
: 指定运行时。--runtime-config-path
: 指定可选的运行时配置文件路径。--sandbox
: 指定沙箱。--seccomp
: 启用默认 seccomp 配置文件。--seccomp-profile
: 指定自定义 seccomp 配置文件。--snapshotter
: 指定快照器。--snapshotter-label
: 添加到新快照的标签。--tty
: 为容器分配 TTY。--user
: 设置用户。--with-ns
: 指定容器运行时要加入的 Linux 命名空间。delete
或del
或remove
或rm
: 删除容器。--keep-snapshot
: 保留容器快照。info
: 获取容器信息。--spec
: 只显示容器规范。list
或ls
: 列出容器。--quiet
或-q
: 只显示容器 ID。label
: 设置或清除容器标签。checkpoint
: 容器快照。--image
: 将镜像包含在快照中。--rw
: 将读写层包含在快照中。--task
: 快照容器任务。restore
: 从快照还原容器。--live
: 从快照还原运行时和内存数据。--rw
: 从快照还原读写层。content
: 管理容器内容。--all-metadata
: 提取所有平台的元数据。--all-platforms
: 从所有平台提取内容。--hosts-dir
: 指定自定义主机配置文件目录。--http-dump
: 在与容器注册表交互时转储所有 HTTP 请求/响应。--http-trace
: 启用注册表交互的 HTTP 跟踪。--label
: 要附加到图像的标签。--metadata-only
: 提取所有元数据,包括清单和配置。--plain-http
: 允许使用纯 HTTP 连接。--platform
: 从特定平台提取内容。--refresh
: 刷新授权服务器的令牌。--skip-verify
或-k
: 跳过验证。--editor
: 选择编辑器。--validate
: 验证结果是否符合格式。--root
: 指定内容存储根目录(默认:/tmp/content
)。--timeout
或-t
: 设置传输超时时间(默认:0 秒)。active
: 显示活动传输。delete
或del
或remove
或rm
: 删除内容。edit
: 编辑 blob 并返回新的摘要。fetch
: 将图像的所有内容提取到 containerd。
images
check
: 检查图像。export
: 将图像导出到 tar 文件。import
: 从 tar 文件导入图像。list
或ls
: 列出图像。--quiet
或-q
: 只显示图像 ID。mount
: 挂载图像。unmount
: 卸载图像。pull
: 从仓库拉取图像。push
: 将图像推送到仓库。prune
: 删除未使用的图像。delete
或del
或remove
或rm
: 删除图像。--sync
: 同步删除图像及其所有关联的内容。tag
: 给图像添加标签。label
: 设置或清除图像标签。convert
: 转换图像。
leases
list
或ls
: 列出租约。create
: 创建租约。delete
或del
或remove
或rm
: 删除租约。
namespaces
create
或c
: 创建命名空间。list
或ls
: 列出命名空间。remove
或rm
: 删除命名空间。label
: 设置或清除命名空间标签。
pprof
block
: 显示块配置文件。goroutines
: 显示 goroutine 配置文件。heap
: 显示堆配置文件。profile
: 显示线程创建配置文件。trace
: 显示跟踪配置文件。run
: 运行 pprof 命令。
snapshots
commit
: 提交快照。diff
: 显示快照差异。info
: 获取快照信息。list
或ls
: 列出快照。mounts
: 显示挂载的快照。prepare
: 准备快照。delete
或del
或remove
或rm
: 删除快照。label
: 设置或清除快照标签。tree
: 显示快照树。unpack
: 解包快照。view
: 查看快照。
tasks
attach
: 附加到任务。checkpoint
: 快照任务。delete
或del
或remove
或rm
: 删除任务。exec
: 在任务中执行命令。list
或ls
: 列出任务。kill
: 杀死任务。metrics
: 获取任务指标。pause
: 暂停任务。ps
: 显示任务状态。resume
: 恢复任务。start
: 启动任务。install
: 安装 OCI 规范。state
: 获取任务状态。
sandboxes
run
或create
或c
或r
: 创建沙箱。list
或ls
: 列出沙箱。remove
或rm
: 删除沙箱。info
: 获取沙箱信息。
示例
# 使用 ctr 命令拉取镜像 ctr image pull docker.io/library/nginx:latest # 查看本地镜像 ctr images ls # 将镜像导出为 tar 文件 ctr images export nginx.tar docker.io/library/nginx:latest # 导入镜像 ctr images import nginx.tar # 删除本地镜像 ctr images rm docker.io/library/nginx:latest # 使用 ctr 命令创建容器 ctr run -d --rm --net-host docker.io/library/nginx:latest my-nginx # 查看当前运行的容器 ctr tasks ls # 查看容器的日志输出 ctr logs my-nginx # 使用 ctr 命令进入容器 ctr tasks exec -t --exec-id myexec my-nginx /bin/sh # 停止运行中的容器 ctr tasks kill -s SIGTERM my-nginx # 删除容器 ctr containers rm my-nginx
crictl
定义和功能: crictl 是一个用于与 Kubernetes CRI(Container Runtime Interface)交互的 CLI 工具。它提供了一组命令,可以用于检查和管理通过 CRI 运行的容器和镜像。 使用场景及实例: crictl 主要用于 Kubernetes 环境下的容器管理。例如,管理员可以使用 crictl 查看当前运行的容器、检查容器日志或执行容器操作。
ctrctl 命令全集
全局选项
--runtime-endpoint
: 指定 CRI 运行时端点(默认:/var/run/crio.sock
)。--runtime
: 指定 CRI 运行时(默认:crio
)。--image-service-endpoint
: 指定镜像服务端点(默认:/var/run/crio.sock
)。--timeout
: 设置命令超时时间(默认:0 秒)。--debug
: 启用调试输出。
容器命令
crictl ps
: 列出所有正在运行的容器。--a
: 只显示容器 ID。crictl inspect
: 获取容器信息。crictl logs
: 查看容器日志。crictl top
: 查看容器中的进程。crictl exec
: 在容器中执行命令。crictl start
: 启动容器。crictl stop
: 停止容器。crictl kill
: 杀死容器。crictl rm
: 删除容器。crictl restart
: 重启容器。crictl pause
: 暂停容器。crictl unpause
: 恢复容器。crictl attach
: 连接到容器。
镜像命令
crictl images
: 列出所有镜像。--a
: 只显示镜像 ID。crictl pull
: 从仓库拉取镜像。crictl push
: 将镜像推送到仓库。crictl image-rm
: 删除镜像。
Pod 命令
crictl pods
: 列出所有 Pod。--a
: 只显示 Pod ID。crictl pod-sandbox
: 获取 Pod 沙箱信息。crictl pod-sandbox-list
: 列出 Pod 沙箱。crictl pod-sandbox-create
: 创建 Pod 沙箱。crictl pod-sandbox-remove
: 删除 Pod 沙箱。crictl pod-sandbox-inspect
: 获取 Pod 沙箱信息。
其他命令
crictl version
: 显示 crictl 版本。crictl help
: 获取帮助信息。
示例
# 查看容器 crictl ps crictl ps -a # 运行容器 crictl runp pod-config.yaml crictl create <pod-id> container-config.yaml pod-config.yaml crictl start <container-id> # 停止容器 crictl stop <container-id> # 删除容器 crictl rm <container-id> # 查看镜像 crictl images # 拉取镜像 crictl pull nginx:latest # 删除镜像 crictl image-rm docker.io/library/nginx:latest # 列出所有 Pod crictl pods # 在名为 nginx 的容器中执行命令 ls -l crictl exec -it nginx ls -l
nerdctl(推荐)
定义和功能: nerdctl 是专为 Containerd 设计的轻量级命令行工具,它的诞生旨在为那些从 Docker 转向 Containerd 的用户提供一个熟悉的操作界面。 使用场景及实例: nerdctl 适合那些熟悉 Docker CLI 但希望使用 containerd 的用户。例如,开发者可以使用 nerdctl 来构建和运行容器,而不需要学习全新的命令集合。
nerdctl 与 Docker 的区别:
底层与上层之别: 最本质的区别在于,Docker 是一个包含了完整容器生命周期管理的平台,包含了 Docker daemon 等多个组件。而 nerdctl 是一个纯粹的命令行工具,专注于与 Containerd 交互,后者作为低层级运行时,处理容器和镜像的实际操作。 兼容与创新: nerdctl 虽然兼容 Docker 的 CLI 习惯,但并不意味着它是 Docker 的简单复制品。它在兼容基础上引入了新功能,如延迟拉取镜像(lazy-pulling)和镜像加密等,这些是 Docker 本身不具备的。 性能与效率: 由于直接操作 Containerd,避免了 Docker daemon 这一层的额外开销,nerdctl 在某些场景下能提供更好的性能和资源利用率。 定位差异: Docker 适合需要一站式解决方案的用户,而 nerdctl+Containerd 组合更适合那些追求轻量、高性能及与 Kubernetes 紧密集成的环境。
nerdctl 命令全集
全局选项
--runtime
: 指定运行时,例如containerd
或crio
(默认:containerd
)。--runtime-endpoint
: 指定运行时端点,例如/run/containerd/containerd.sock
。--namespace
: 指定命名空间。--help
或-h
: 显示帮助信息。--version
或-v
: 显示版本信息。--debug
: 启用调试模式。
容器命令
nerdctl run
: 运行容器。nerdctl start
: 启动容器。nerdctl stop
: 停止容器。nerdctl restart
: 重启容器。nerdctl kill
: 杀死容器。nerdctl pause
: 暂停容器。nerdctl unpause
: 恢复容器。nerdctl ps
: 列出所有容器。-a
: 显示所有容器,包括已停止的容器。-f
: 按过滤器筛选容器。nerdctl top
: 查看容器中的进程。nerdctl logs
: 查看容器日志。nerdctl exec
: 在容器中执行命令。nerdctl attach
: 连接到容器。nerdctl inspect
: 查看容器信息。nerdctl rm
: 删除容器。nerdctl commit
: 提交容器到新的镜像。nerdctl port
: 查看容器端口映射。
镜像命令
nerdctl pull
: 从仓库拉取镜像。nerdctl push
: 将镜像推送到仓库。nerdctl images
: 列出所有镜像。-a
: 显示所有镜像,包括未标记的镜像。-f
: 按过滤器筛选镜像。nerdctl image-rm
: 删除镜像。nerdctl tag
: 给镜像添加标签。
网络命令
nerdctl network create
: 创建网络。nerdctl network ls
: 列出所有网络。nerdctl network remove
: 删除网络。nerdctl network connect
: 将容器连接到网络。nerdctl network disconnect
: 将容器从网络断开连接。nerdctl network inspect
: 查看网络信息。
卷命令
nerdctl volume create
: 创建卷。nerdctl volume ls
: 列出所有卷。nerdctl volume remove
: 删除卷。nerdctl volume inspect
: 查看卷信息。
其他命令
nerdctl system prune
: 删除未使用的镜像、容器、网络和卷。nerdctl info
: 显示 nerdctl 的系统信息。nerdctl version
: 显示 nerdctl 版本。nerdctl build
: 构建镜像。
示例
# 从 Docker Hub 拉取 nginx 镜像 nerdctl pull nginx:latest # 构建一个名为 my-nginx 的镜像 nerdctl build -t my-nginx . # 运行一个名为 my-nginx 的容器 nerdctl run -d --name my-nginx -p 80:80 nginx:latest # 列出所有正在运行的容器 nerdctl ps # 停止容器 nerdctl stop my-nginx # 删除容器 nerdctl rm my-nginx
参考: