如何在命令行下优雅的管理 Containerd
containerd
是一个高级容器运行时,又名容器管理器。简单来说,它是一个守护进程,在单个主机上管理完整的容器生命周期:创建、启动、停止容器、拉取和存储镜像、配置挂载、网络等。
Containerd
被设计成可以很容易地嵌入到更大的系统中。Docker
使用containerd
来运行容器。Kubernetes
可以通过CRI
使用containerd
来管理单个节点上的容器。但是较小的项目也可以从与containerd
集成的便利中获益——例如,faasd
使用containerd
在独立的服务器上运行一个成熟的功能即服务解决方案。
但是,以编程方式使用 containerd
并不是唯一的选择。它还可以通过可用客户端之一从命令行使用。由此产生的容器 UX
可能不像docker
客户端提供的那样全面和用户友好,但它仍然是有用的,例如,用于调试或学习目的。
如何在 ctr 中使用 containerd
ctr
是作为 containerd
项目的一部分提供的命令行客户端。如果您在一台机器上运行了 containerd
,那么ctr
二进制文件很可能也在那里。
该ctr
界面 [显然] 与 Docker CLI
不兼容,乍一看,可能看起来不太用户友好。显然,它的主要受众是测试守护进程的容器开发人员。但是,由于它最接近实际的 containerd API
,因此它可以作为一种很好的探索手段——通过检查可用命令,您可以大致了解 containerd
可以做什么和不可以做什么。
ctr
也非常适合学习的能力低级别[OCI]
容器的运行时间,因为ctr + containerd
是更接近实际的容器比docker + dockerd
。
使用 ctr 处理容器镜像
当拉取镜像,完全合格的参考似乎是必需的,所以你不能忽略镜像仓库或标签部分:
$ ctr images pull docker.io/library/nginx:1.21
$ ctr images pull docker.io/kennethreitz/httpbin:latest
$ ctr images pull docker.io/kennethreitz/httpbin:latest
$ ctr images pull quay.io/quay/redis:latest
要列出本地镜像,可以使用:
$ ctr images ls
令人惊讶的是,containerd
不提供开箱即用的镜像构建支持。然而,containerd
本身经常被更高级别的工具用来构建镜像。
不使用ctr
构建镜像,您可以导入用docker build
或其他oci
兼容软件构建的现有镜像:
$ docker build -t my-app .
$ docker save -o my-app.tar my-app
$ ctr images import my-app.tar
有了ctr
,你也可以挂载镜像
$ mkdir /tmp/httpbin
$ ctr images mount docker.io/kennethreitz/httpbin:latest /tmp/httpbin
$ ls -l /tmp/httpbin/
total 80
drwxr-xr-x 2 root root 4096 Oct 18 2018 bin
drwxr-xr-x 2 root root 4096 Apr 24 2018 boot
drwxr-xr-x 4 root root 4096 Oct 18 2018 dev
drwxr-xr-x 1 root root 4096 Oct 24 2018 etc
drwxr-xr-x 2 root root 4096 Apr 24 2018 home
drwxr-xr-x 3 root root 4096 Oct 24 2018 httpbin
...
$ ctr images unmount /tmp/httpbin
要使用ctrl
删除图像,请运行:
$ ctr images remove docker.io/library/nginx:1.21
使用ctr处理容器
有了一个本地镜像,你可以通过ctr
运行<image-ref> <container-id>
来运行一个容器。例如:
$ ctr run --rm -t docker.io/library/debian:latest cont1
注意,与友好的docker
运行生成唯一的容器ID
不同,使用ctr
,你必须自己提供唯一的容器ID
。ctr
运行命令也只支持一些常见的docker
运行标志:——env, -t,——tty, -d,——detach,——rm
,等等。但是没有端口发布或使用——restart=
总是开箱即用的自动容器重新启动。
与镜像类似,你可以列出现有的容器:
$ ctr containers ls
有趣的是,ctrl
运行命令实际上是ctrl
容器创建+ ctrl
任务启动的快捷方式:
$ ctr container create -t docker.io/library/nginx:latest nginx_1
$ ctr container ls
CONTAINER IMAGE RUNTIME
nginx_1 docker.io/library/nginx:latest io.containerd.runc.v2
$ ctr task ls
TASK PID STATUS # Empty!
$ ctr task start -d nginx_1 # -d for --detach
$ ctr task list
TASK PID STATUS
nginx_1 10074 RUNNING
我喜欢这种容器和任务子命令的分离,因为它反映了经常被遗忘的OCI
容器的本质。尽管人们普遍认为容器不是进程——对于进程来说,容器是隔离的和受限制的执行环境。
使用ctr
任务连接,你可以重新连接到一个在容器中运行的现有任务的stdio
流:
$ ctr task attach nginx_1
2021/09/12 15:42:20 [notice] 1#1: using the "epoll" event method
2021/09/12 15:42:20 [notice] 1#1: nginx/1.21.3
2021/09/12 15:42:20 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
2021/09/12 15:42:20 [notice] 1#1: OS: Linux 4.19.0-17-amd64
2021/09/12 15:42:20 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1024:1024
2021/09/12 15:42:20 [notice] 1#1: start worker processes
2021/09/12 15:42:20 [notice] 1#1: start worker process 31
...
很像docker
,你可以在一个已有的容器中执行一个任务:
$ ctr task exec -t --exec-id bash_1 nginx_1 bash
# From inside the container:
$ root@host:/# curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...
在移除一个容器之前,它的所有任务必须停止:
$ ctr task kill -9 nginx_1
或者,你可以使用——force
标志删除正在运行的任务:
$ ctr task rm -f nginx_1
最后,要删除容器,运行:
$ ctr container rm nginx_1
如何使用容器与nerdctl
Nerdctl
是一个相对较新的containerd
命令行客户端。与ctr
不同,nerdctl
的目标是用户友好和docker
兼容。在某种程度上,nerdctl + containerd
可以无缝地替代docker + dockerd
。然而,这似乎不是项目的目标:
nerdctl
的目标是促进试验Docker
中没有的最前沿的容器特性。这些特性包括但不限于lazy-pulling(stargz)
和镜像加密(ocicrypt
)。这些功能预计最终也会在Docker
中实现,然而,这可能需要几个月,甚至几年的时间,因为Docker
目前只设计使用了容器子系统的一小部分。重构Docker
以使用整个容器是可能的,但并不简单。所以我们[NTT]
决定创建一个完全使用container
的CLI
,但我们不打算用Docker
来完成。我们一直在为Docker/Moby
以及容器做出贡献,并将继续这样做。
从基本用法的角度来看,与ctr
相比,nerdctl
支持:
使用 nerdctl
构建镜像容器网络管理 Docker Compose
与nerdctl Compose up
最酷的部分是 nerdctl
试图提供docker
(和podman
)命令行UX
相同的功能。所以,如果你熟悉docker
(或podman
)CLI
,你就已经熟悉nerdctl
了。
如何使用容器与crictl
crictl
是一个命令行客户端,用于[Kubernetes] cri
兼容的容器运行时。
引入 Kubernetes
容器运行时接口 (CRI
)以使 Kubernetes
容器运行时不可知。Kubernetes
节点代理kubelet
实现了 CRI
客户端 API
,可以使用任何实现 CRI
服务器 API
的容器运行时来管理其节点上的容器和 Pod
。
Kubernetes CRI
从1.1
版开始,containerd
就自带了一个内置的CRI
插件。因此,containerd
是一个与cri
兼容的容器运行时。因此,它可以与critl
一起使用。
创建crictl
是为了检查和调试Kubernetes
节点上的容器运行时和应用程序。支持以下操作:
attach: Attach to a running container
create: Create a new container
exec: Run a command in a running container
version: Display runtime version information
images, image, img: List images
inspect: Display the status of one or more containers
inspecti: Return the status of one or more images
imagefsinfo: Return image filesystem info
inspectp: Display the status of one or more pods
logs: Fetch the logs of a container
port-forward: Forward local port to a pod
ps: List containers
pull: Pull an image from a registry
run: Run a new container inside a sandbox
runp: Run a new pod
rm: Remove one or more containers
rmi: Remove one or more images
rmp: Remove one or more pods
pods: List pods
start: Start one or more created containers
info: Display information of the container runtime
stop: Stop one or more running containers
stopp: Stop one or more running pods
update: Update one or more running containers
config: Get and set crictl client configuration options
stats: List container(s) resource usage statistics
这里有趣的部分是,通过crictl + containerdbundle
,人们可以了解pod
是如何实际实现的。
有关如何crictl
与 containerd
一起使用的更多信息,请查看此文档(containerd
项目的一部分)。
https://github.com/containerd/cri/blob/68b61297b59e38c1088db10fbd19807a4ffbad87/docs/crictl.md
参考资料
https://iximiuz.com/en/posts/containerd-command-line-clients/
本文转载自:「云原生CTO」,原文:https://tinyurl.com/sm5x829d,版权归原作者所有。