一、containerd简介

官 方 文 档 : https://containerd.io

    在 2016 年 12 月 14 日,Docker 公司宣布将containerd 从 Docker 中分离,由开源社区独立发展和运营。Containerd 完全可以单独运行并管理容器,而 Containerd 的主要职责是镜像管理和容器执行。同时,Containerd 提供了 containerd-shim 接口封装层,
向下继续对接 runC 项目,使得容器引擎 Docker Daemon 可以独立升级。 Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。总结一下,它主要负责干以下事情:
• 管理容器的生命周期(从创建容器到销毁容器)
• 拉取/推送容器镜像
• 存储管理(管理镜像及容器数据的存储)
• 调用 runC 运行容器(与 runC 等容器运行时交互)
• 管理容器网络接口及网络 1.docker与containerd之间的关系
Docker 包含 Containerd,Containerd 专注于运行时的容器管理,而 Docker 除了容器管理之外,还可以完成镜像构建之类的功能。
Containerd 提供的 API 偏底层,不是给普通用户直接用的,容器编排的开发者才需要Containerd。 2.Containerd 在容器生态中扮演的角色
Containerd 并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如 Kubernetes等容器编排系统。
Containerd 以 daemon 的形式运行在系统上,通过 unix domain socket 暴露底层的 grpc API,上层系统可以通过这些 API 管理机器上的容器.

containerd不包含runc,但是运行容器需要runc

cri-container不包含cni,但是运行容器也需要cni plugin

cri-container-cni包含runc,包含cni。需要解压到根目录下

K8S 为什么要放弃使用 Docker 作为容器运行时,而使用 containerd 呢?
Docker,Kubernetes 等工具来运行一个容器时会调用容器运行时(CRI),比如 containerd,CRI- O,通过容器运行时来完成容器的创建、运行、销毁等实际工作,Docker 使用的是 containerd 作为其运行时;Kubernetes 支持 docker(
在 k8s1.24 版本之前用,1.24 开始废弃了)、containerd, CRI-O 等多种容器运行时,这些容器运行时都遵循了 OCI 规范,并通过 runc 来实现与操作系统内核交互来完成容器的创建和运行 备注:CRI
CRI 是一个插件接口,它使 kubelet 能够使用各种容器运行时,你需要在集群中的每个节点上都有一个可以正常工作的容器运行时, 这样 kubelet 能启动 Pod 及其容器。容器运行时接口(CRI)是kubelet 和容器运行时之间通信的主要协议。 OCI:
OCI, Open Container Initiative ,是一个轻量级,开放的治理结构(项目),在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。 OCI 项目由 Docker,CoreOS(后来被 Red Hat 收购了,相应的席位被 Red Hat 继承)和容器行业
中的其他领导者在 2015 年 6 月的时候启动。 k8s使用containerd具体原因:
如果你使用 Docker 作为 K8S 容器运行时的话,kubelet 需要先要通过 dockershim 去调用 Docker, 再通过 Docker 去调用containerd。
如果你使用 containerd 作为K8S 容器运行时的话, kubelet 可以直接调用 containerd。
使用 containerd 不仅性能提高了(调用链变短了),而且资源占用也会变小(Docker 不是一个纯粹的容器运行时,具有大量其他功能)。 调用链
Docker 作为 k8s 容器运行时,调用关系如下:
kubelet --> docker shim (在 kubelet 进程中) --> dockerd --> containerd Containerd 作为 k8s 容器运行时,调用关系如下:
kubelet --> cri plugin(在 containerd 进程中) --> containerd

二、containerd安装

# 1.安装源和依赖软件包(与docker没区别)
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum makecache fast # 2.安装containerd
yum install containerd -y
containerd --version # 查看containerd版本 # 3.启动containerd
systemctl start containerd && systemctl enable containerd && systemctl status containerd # 4.修改contianerd配置文件,配置镜像仓库加速地址
# 直接生产默认配置文件:containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
[plugins]
[plugins.cri]
[plugins."io.containerd.grpc.v1.cri"]
# 将镜像下载地址改为阿里云地址
sandbox_image = "registry.cn- hangzhou.aliyuncs.com/google_containers/pause:3.6" ###自有镜像源配置
[plugins.cri.registry]
[plugins.cri.registry.mirrors]
[plugins.cri.registry.mirrors."docker.io"]
endpoint = ["https://pft7f97f.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn"]
[plugins.cri.registry.mirrors."gcr.io"]
endpoint = [
"https://gcr.mirrors.ustc.edu.cn"
]
[plugins.cri.registry.mirrors."k8s.gcr.io"]
endpoint = [
"https://gcr.mirrors.ustc.edu.cn/google-containers/"
]
[plugins.cri.registry.mirrors."quay.io"]
endpoint = [
"https://quay.mirrors.ustc.edu.cn"
] systemctl daemon-reload && systemctl restart containerd && systemctl status containerd

# 5.开启包转发功能和修改内核参数
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1 参数生效:sysctl -p
查看: lsmod | grep br_netfilter

2.containerd设置私有镜像仓库

#1. 找到.registry.configs增加以下内容

[plugins."io.containerd.grpc.v1.cri".registry]
  config_path = ""
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.test.com:6443"]
      endpoint = ["https://harbor.test.com:6443"]
    [plugins."io.containerd.grpc.v1.cri".registry.configs]
      [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.test.com:6443".tls]
        insecure_skip_verify = true
      [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.test.com:6443".auth]
        username = "name"
        password = "pass"

systemctl restart containerd
最好不要使用别的端口了直接80快速方便
测试:crictl pull harbor.test.com:6443/app:v1
# 拉取镜像命令
ctr images pull harbor.test.com:6443/tools/centos:centos7.9.2009 --skip-verify 或者
ctr images pull harbor.test.com:6443/tools/centos:centos7.9.2009 --skip-verify --user=admin:harbor123

3.containerd镜像操作

命令介绍:
ctr:是containerd本身的CLI
crictl :是Kubernetes社区定义的专门CLI工具 1.查看本地镜像列表
ctr images list 或者 crictl images
查看导入的镜像
ctr images ls 列表名称:
REF TYPE DIGEST SIZE PLATFORMS LABELS 2.下载镜像命令
ctr images pull docker.io/rancher/mirrored-pause # 3.上传命令:打标签
ctr images tag docker.io/docker/alpine:latest host/test/alping:v1

ctr i tag docker.io/docker/alpine:latest host/test/alping:v1
ctr images pull host/test/alping:v1 
# 4.导入/导出本地镜像
ctr images import app.tar
ctr images exporter
[root@node1 ~]# ctr i ls -q
docker.io/library/busybox:1.28
docker.io/library/tomcat:8.5-jre8-alpine # 导出
[root@node1 ~]# ctr images export busybox-1.28.tar.gz docker.io/library/busybox:1.28 # 删除
[root@node1 ~]# ctr images rm docker.io/library/busybox:1.28 或 ctr i rm docker.io/library/busybox:1.28
docker.io/library/busybox:1.28 # 导入
[root@node1 ~]# ctr images import busybox-1.28.tar.gz
unpacking docker.io/library/busybox:1.28 (sha256:585093da3a716161ec2b2595011051a90d2f089bc2a25b4a34a18e2cf542527c)...done # 查看容器名称列表
[root@node1 ~]# ctr i ls -q
docker.io/library/busybox:1.28
docker.io/library/tomcat:8.5-jre8-alpine
# 5.显示运行的容器列表
crictl ps # 6.删除本地镜像
ctr images ls
crictl rmi # 没生效可以使用下面这个
ctr i rm REF名称

# 7. 查看容器资源情况
crictl stats

# 8.登录容器平台
crictl exec

# 9.容器启动和停止
crictl start/stop

# 10.查看容器日志
crictl logs
[root@master containerd]# ctr image --help
NAME:
ctr images - manage images USAGE:
ctr images command [command options] [arguments...] COMMANDS:
check check existing images to ensure all content is available locally
export export images
import import images
list, ls list images known to containerd
mount mount an image to a target path
unmount unmount the image from the target
pull pull an image from a remote
push push an image to a remote
delete, del, remove, rm remove one or more images by reference
tag tag an image
label set and clear labels for an image
convert convert an image
11.查看containerd默认命名空间
[root@moban containerd]# ctr namespace ls
NAME LABELS
default
moby
ctr 有命名空间 namespace 来指定类似于工作空间的隔离区域。使用方法 ctr -n default images ls来查看 default 命名空间的镜像,不加 -n 参数,默认也是使用 default 的命名空间。 12.查看默认名称空间下镜像
[root@moban containerd]# ctr -n=default images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 application/vnd.docker.distribution.manifest.list.v2+json sha256:3d380ca8864549e74af4b29c10f9cb0956236dfb01c40ca076fb6c37253234db 294.7 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 -

4.基于containerd运行容器

#基于 containerd 运行一个容器
这里要解释一个概念 containers 和 task ,在 docker 里面 container 概念被弱化 ,将 containers 和 task 整合在一起,基于 docker run 可以运行容器。
ctr 中 containers 是镜像实例化的一个虚拟环境,提供一个磁盘,模拟空间,就好比你电脑处于关机状态一样。
ctr 中 tasks 是将容器运行起来,电脑开机了 ,初始化进程等 ,task 就是的这么个形式。 [root@moban containerd]# ctr image pull docker.io/library/busybox:latest # 运行容器
[root@moban containerd]# ctr run -d docker.io/library/busybox:latest busybox-v1 # 查看容器在宿主机的PID
[root@moban containerd]# ctr task ls
TASK PID STATUS
busybox-v1 3914 RUNNING # 进入容器
[root@moban containerd]# ctr task exec --exec-id 3914 -t busybox-v1 sh
/ # # 删除容器
# 可以先停止容器再删除

[root@moban containerd]# ctr task kill --signal 9 busybox-v1
[root@moban containerd]# ctr task ls
TASK PID STATUS
busybox-v1 4233 STOPPED

# 直接删除

[root@moban containerd]# ctr task rm -f busybox-v1
WARN[0000] task busybox-v1 exit with non-zero exit code 137
# 容器运行停止
[root@moban containerd]# ctr task ls
TASK PID STATUS
# 查看
[root@moban containerd]# ctr c ls
CONTAINER IMAGE RUNTIME
busybox-v1 docker.io/library/busybox:latest io.containerd.runc.v2
# 删除
[root@moban containerd]# ctr c rm busybox-v1

5.上传镜像

# 镜像拉取需要加上参数--all-platform,否则上传时候会出现not found报错
ctr images pull --all-platforms harbor.test.com:6443/tools/busybox:latest # 1.标签
[root@moban containerd]# ctr images tag docker.io/library/busybox:latest harbor96.9you.com:6443/tools/busybox:v1
harbor96.9you.com:6443/tools/busybox:v1 # 上传
[root@moban containerd]# ctr images push harbor.test.com:6443/tools/busybox:v1 --user=admin:harbor123 ctr images push harbor.test.com:6443/tools/busybox:v1 --skip-verify
ctr images push harbor.test.com:6443/tools/busybox:v1 --skip-verify --user=admin:harbor123

6.镜像加速器第二种添加方式

# 修改/etc/containerd/config.toml

    [plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d" cd /etc/containerd/certs.d
cat hosts.toml
[host."https://vh3bm52y.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]
capabilities = ["pull"] systemctl restart containerd

7.docker与containerd命令比对

containerd基本使用命令的更多相关文章

  1. containerd与kubernetes集成

    kubernetes集群三步安装 概念介绍 cri (Container runtime interface) cri is a containerd plugin implementation of ...

  2. containerd简述

    containerd是容器虚拟化技术,从docker中剥离出来,形成开放容器接口(OCI)标准的一部分. docker对容器的管理和操作基本都是通过containerd完成的.Containerd 是 ...

  3. Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed

    Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but ...

  4. 实操|如何将 Containerd 用作 Kubernetes runtime

    日前专为开发者提供技术分享的又拍云 OpenTalk 公开课邀请了网易有道资深运维开发工程师张晋涛,直播分享<Containerd 上手实践 >,详细介绍 Containerd 的发展历程 ...

  5. k8s入坑之路(3)containerd容器

    containerd概念: containerd主要是namebases与k8s docker不同 存放路径不一致 没有默认仓库 容器运行时: 2020年未kubernetes宣布不再支持docker ...

  6. containerd与kubernetes集成部署

    概念介绍 cri (Container runtime interface) cri is a containerd plugin implementation of Kubernetes conta ...

  7. Kubernetes将弃用Docker!与 containerd容器引擎

    时间戳:2022-06-07 20:32:19 星期二 撰写文档参考:(阿良-腾讯课堂)Kubernetes将弃用Docker 参考博客k8s入坑之路(3)containerd容器 container ...

  8. Containerd教程

    文档是从B站有关视频上对应找到的,具体视频地址是:https://www.bilibili.com/video/BV1XL4y1F7QB?p=21&spm_id_from=333.880.my ...

  9. containerd 卸载

    一.创建脚本 cat > remove.sh <<EOF #!/bin/bash # 删除contained命令及配置 rm -rf /usr/local/bin/ rm -rf / ...

  10. kubernetes:v1.25 + containerd

    由于kubernets从v1.24开始停止支持dockershim,kubernets不再支持通过docker来创建和管理容器.本文记录安装kubernetes v1.25 + containerd ...

随机推荐

  1. APP备案通知

    截至2024年4月1日前,所以已上市APP均需备案,未备案的可以登陆云擎官网进行备案. 关于工信部开展在中华人民共和国境内从事互联网信息服务的APP主办者,应当依法履行备案手续,未履行备案手续的,不得 ...

  2. Spring Cloud相关组件说明

    1.Spring Cloud版本 现有Spring Cloud有两代实现,分为Spring Cloud Netflix和Spring Cloud Alibaba,由于SpringCloud Netfl ...

  3. KingbaseES 中的xmin,xmax等系统字段说明

    在KingbaseES中,当我们创建一个数据表时,数据库会隐式增加几个系统字段.这些字段由系统进行维护,用户一般不会感知它们的存在. 例如,以下语句创建了一个简单的表: create table te ...

  4. FFmpeg开发笔记(九)Linux交叉编译Android的x265库

    ​<FFmpeg开发实战:从零基础到短视频上线>一书的"12.1.2  交叉编译Android需要的so库"介绍了如何在Windows环境交叉编译Android所需FF ...

  5. Scala 不可变数组Array

    1 package chapter07 2 3 object Test01_ImmutableArray { 4 def main(args: Array[String]): Unit = { 5 / ...

  6. 【mybatis踩坑】mybatis获取类型为字符串String的参数自动加引号

    今天写了一个简单的测试例子,用mybatis实现新建一个MySQL数据表 整体是JavaWeb项目,下面的代码是不完整的. 这是mapper 1 <?xml version="1.0& ...

  7. ASCII编码的全面介绍

    1. ASCII编码的定义和历史 ASCII(American Standard Code for Information Interchange)是一种用于将文本字符转换为数字编码的标准,最初由美国 ...

  8. #搜索,计算几何#JZOJ 4016 圈地为王

    题目 在\(n\)行\(m\)列的网格中,你要圈一些地. 你从左上角出发,最后返回左上角,路径内部的区域视为被你圈住. 你不可以进入网格内部, 只能在边上行走. 你的路径不能在左上角以外自交, 但是边 ...

  9. Mac 修改版本号

    修改版本号 在安装某些软件(XCode)的过程中, 系统会提示版本低,需要升级到高版本, 而很多人不想升级而需要安装这些软件, 此时只需将版本号修改成软件安装要求的版本号就可以了. 由于SystemV ...

  10. Asp-Net-Core开发笔记:使用alpine镜像并加入健康检查

    前言 使用 docker 部署 AspNetCore 应用已经是标配了,之前我一直使用 mcr.microsoft.com/dotnet/aspnet:8.0 这类镜像,简单粗暴,不过可以使用 alp ...