1. 工具介绍
当我们的容器进行时从 Docker 切换为 Containerd 后,需要从 docker 命令行切换到 Containerd 的命令行。常见的 Containerd 客户端命令行有 ctr 和 crictl。
1.1 ctr
ctr 是 containerd 官方的命令行工具,功能相对简单,可以实现拉取镜像 创建容器等功能;
需要注意的是,ctr 支持选择 namespace,这个 namespace 不是 kubernetes 里面的 namespace,而是 containerd 中的 namespace,一个 namespace 里面的镜像、容器等资源,在另一个 namespace 里面是看不到的。
默认情况下操作的 都是 default namespace 中的容器和镜像资源,kubernetes 集群中的容器、镜像等资源都放置在 k8s.io 这个 namespace 中。
我们可以使用 -n namespace 来指定操作的是哪个 namespace,也可以使用 ctr namespace ls 查看有哪些 namespace。比如,加上 -n k8s.io 选项之后就可以查看 kubernetes 中的容器和镜像资源了。
1.2 crictl
crictl 是 kubernetes cri-tools 的一部分,是专门为 kubernetes 使用 containerd 而专门制作的,提供了 Pod、容器和镜像等资源的管理命令。
需要注意的是:使用其他非 kubernetes 创建的容器、镜像,crictl 是无法看到和调试的,比如说 ctr run 在未指定 namespace 情况下运行起来的容器就无法使用 crictl 看到。当然 ctr 可以使用 -n k8s.io 指定操作的 namespace 为 k8s.io,从而可以看到/操作 kubernetes 集群中容器、镜像等资源。可以理解为:crictl 操作的时候指定了 containerd 的 namespace 为 k8s.io。
2. 工具使用
2.1 命令对比
ctr 中假如没有指定 -n k8s.io 则表示查看非 kubernetes 中的容器、镜像资源,ctr 中指定了 -n k8s.io 则表示查看 kubernetes 中的容器、镜像资源。
crictl 命令默认就是获取 k8s.io namespace 下面的资源信息。
命令 | docker | crictl | ctr |
---|---|---|---|
查看容器列表 | docker ps | crictl ps | ctr container ls(查看非 kubernetes 中的容器)ctr -n k8s.io container ls(查看 kubernetes 集群中的容器) |
查看容器详情 | docker inspect | crictl inspect | ctr container info |
查看容器日志 | docker logs | crictl logs | 无 |
容器内执行命令 | docker exec | crictl exec | ctr task exec |
挂载容器 | docker attach | crictl attach | ctr task attach |
显示容器资源使用情况 | docker stats | crictl stats | 无 |
创建容器 | docker create | crictl create | ctr container create |
启动容器 | docker start | crictl start | ctr task start(请看使用示例) |
运行容器 | docker run | crictl run | ctr run |
停止容器 | docker stop | crictl stop | ctr task kill (请看使用示例) |
删除容器 | docker rm | crictl rm | ctr container rm |
查看docker/containerd系统信息 | docker info | crictl info | 无 |
查看镜像列表 | docker images | crictl images | ctr image ls |
查看镜像详情 | docker inspect | crictl inspecti | 无 |
导入镜像 | docker load | 无 | ctr image import |
导出镜像 | docker save | 无 | ctr image export |
拉取镜像 | docker pull | crictl pull | ctr image pull(请看使用示例) |
推送镜像 | docker push | 无 | ctr image push(请看使用示例) |
tag 镜像 | docker tag | 无 | ctr image tag(请看使用示例) |
删除镜像 | docker rmi | crictl rmi | ctr image rm |
查看Pod列表 | 无 | crictl pods | 无 |
查看Pod详情 | 无 | crictl inspectp | 无 |
启动Pod | 无 | crictl runp | 无 |
停止Pod | 无 | crictl stopp | 无 |
2.2 使用示例
2.2.1 查看镜像
# 查看默认 namespace 中的镜像
ctr image ls
# 指定 namespace 为 k8s.io,表示操作的是 kubernetes 集群中的镜像资源
ctr -n k8s.io image ls
# 查看 kubernetes 中的镜像
crictl image
2.1.2 拉取/推送/tag镜像
# 拉取镜像,ctr 拉取时需要指定全路径
ctr image pull docker.io/library/nginx:latest
# 遇到 `http: server gave HTTP response to HTTPS client` 问题时,使用 --plain-http
ctr image pull registry-internal.oecp.aliyuncs.com:5000/oecp/busybox:stable --plain-http
# 指定 namespace 为 k8s.io,表示操作的是 kubernetes 集群中的镜像资源,遇到 ctr image push xxx 时,报错 ctr: content digest sha256:35e28b647bd4976b7cacfaa32b7b253817d0881d77b6cda731ad46a29d08c2cb: not found 问题时,需要添加 --all-platforms 参数
ctr -n k8s.io image pull docker.io/library/nginx:latest --all-platforms
# tag docker.io/library/busybox:1.28 镜像为 172.16.136.18:5000/transwarp/busybox:1.28
ctr images tag docker.io/library/busybox:1.28 172.16.136.18:5000/transwarp/busybox:1.28
# 推送镜像指镜像仓库
ctr images push 172.16.136.18:5000/transwarp/busybox:1.28
# 拉取镜像,会拉取 docker.io/library/nginx:latest 这个镜像
crictl pull nginx
2.1.3 导入/导出镜像
# 导入镜像,指定 namespace 为 k8s.io,表明镜像导入是为了 k8s 集群使用的,若是不加 namespace,默认是 default 租户,k8s 下 pod 无法使用到镜像
# 格式为 ctr image import <image-filename>
ctr -n k8s.io image import antrea-ovs.tar
# 导出镜像,可以上传到其他节点使用
# 格式为 ctr image export <output-filename> <image-name>
ctr -n k8s.io image export pause.tar registry.aliyuncs.com/google_containers/pause:3.6
2.1.4 删除镜像
# ctr 删除 docker.io/library/nginx:latest 这个镜像
ctr image rm docker.io/library/nginx:latest
# crictl 删除 nginx 镜像,删除的是 docker.io/library/nginx:latest 这个镜像
crictl rmi nginx
2.1.5 查看容器
# ctr 查看容器,无 -a 选项
# 这里的 contaienr 和 task 是有区别的:
# 1. container 对象是指包含了一个容器所需要的资源及配置的数据结构,并没有处于运行状态,是一个静态容器。
# 这个时候 namespaces(containerd 中的,非 kubernetes 中的)、rootfs 和容器的配置都已经初始化成功了。
# 2. task 代表任务的意思,是 container 对象运行起来之后的表示。
# ctr task start CONTAINER_NAME 会真正启动一个容器。
# 容器真正 run 起来之后,会存在 container 和 task 两个对象!
# 查看 container 对象
ctr container ls
# 查看 task 对象,可以看到运行的状态
ctr task ls
# crictl 查看容器,-a 是指查看所有状态
crictl ps
crictl ps -a
2.1.6 启动容器
# 1. 先创建名为 demo_container 的 container 对象
ctr container create docker.io/library/nginx:latest demo_container
# 2. 再紧接着执行 ctr task start 才会真正启动一个容器,container 对象只是一个静态的数据结构。-d 同 docker 中的 -d
ctr task start -d demo_container
# 效果同上,相同将上面两个步骤合为一步,直接启动一个真正的容器,也会有 container 和 task 两个对象
ctr run -d docker.io/library/nginx:latest demo_container
# crictl 无法直接创建一个容器,需要在 sandbox 中创建容器
crictl run container-config.[json|yaml] pod-config.[json|yaml]
2.1.7 删除容器
# 1. 先 kill 掉 task 对象
ctr task kill demo_container
# 2. 再 rm 掉 container 对象
ctr container rm demo_container
# crictl 停止、删除容器
# 1. 先停止掉 container
crictl stop CONTAINER-ID
# 2. rm 掉 container
crictl rm CONTAINER-ID