# containerd教程 - 4 容器管理
好了,有了镜像了,可以通过镜像来运行容器了。
关于容器操作的命令可以使用:ctr containers
、ctr container
、ctr c
,这三个命令是一样的,后面容器的操作,使用这三个都可以。
注意,下面创建和操作容器的时候,容器是没有网络的,所以容器没有办法通过网络和外部进行交互。
# 4.1 创建容器
在创建容器之前,首先要下载容器的镜像,否则会提示找不到镜像,而不是帮你下载。
首先下载一个 nginx 镜像:
ctr images pull docker.io/library/nginx:latest
创建容器使用 create
命令:
ctr c create docker.io/library/nginx:latest my-nginx
ctr c create
:创建容器的命令;docker.io/library/nginx:latest
:镜像名称;my-nginx
:创建的容器名称,自己定义。
注意:使用 create
命令创建容器后,并没有启动容器。
# 4.2 查看容器
查看容器使用 ls
命令。
ctr c ls
会显示容器名称,容器使用的镜像等信息。
但是通过 ctr c ls
命令并不能看到容器是否运行。
# 4.3 查看任务
要查看容器是否运行,需要使用 ctr task
命令:
ctr task ls
# 或者
ctr t ls
2
3
ctr task
命令会列出所有正在运行的任务,也就是容器。(在 containerd 的上下文中,任务通常指的是一个正在运行的容器实例)。
此时还没有启动容器,所以执行 ctr task ls
,没有任务显示。
# 4.4 启动容器
上面已经创建容器,但是没有启动,启动或启动一个已停止的容器,可以使用 start
命令:
ctr task start -d my-nginx
ctr task start
:启动容器的命令;-d
:后台运行,否在在终端中运行,ctrl + c
容器就停止了;my-nginx
:容器名称。
注意这里启动的是任务,启动容器也就是启动任务,启动后,就可以查看任务了:
可以看到 my-nginx
容器运行 RUNNING 起来了。
任务的 PID 是容器在宿主机上的进程,可以使用如下命令查看:
ps -ef|grep <PID>
# 4.5 创建并启动容器
前面创建容器,然后再启动,有些麻烦,我们可以直接创建并启动容器,使用 run
命令即可:
ctr run -d docker.io/library/nginx:latest my-nginx2
ctr run
:运行容器的命令;-d
:后台运行;docker.io/library/nginx:latest
:容器所使用的镜像名称;my-nginx2
:容器的名称,自定义;
查看任务状态,可以看到容器在运行中:
root@doubibiji-server:~# ctr task ls
TASK PID STATUS
my-nginx2 1542 RUNNING
my-nginx 1260 RUNNING
root@doubibiji-server:~#
2
3
4
5
# 4.6 进入和退出容器
如果想要进入容器内部执行一些操作,可以使用如下命令:
# 进入 my-nginx 内部
ctr task exec --exec-id $RANDOM -t my-nginx /bin/sh
2
ctr task exec
:进入容器的命令;--exec-id $RANDOM
:为这次执行操作指定一个唯一的ID,为了避免重复,所以使用了$RANDOM
随机数,当然手动写个123也是可以的;-t
:用于为新的执行进程分配一个伪终端,这使得输出更加友好,并且允许在执行进程内部使用交互式终端;my-nginx
:要进入的容器名称;/bin/sh
:在容器内启动的程序;
进入到容器,直接输入命令执行即可,例如这里我直接使用 curl
命令访问 nginx 的首页:
root@doubibiji-server:~# ctr task exec --exec-id $RANDOM -t my-nginx /bin/sh
# curl http://127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
退出容器,直接在容器内部执行 exit
命令即可。
# 4.7 暂停容器任务
如果要暂停容器,可以使用 ctr task pause
命令:
ctr task pause my-nginx
ctr task pause
:暂停容器的命令;my-nginx
:要暂停的容器名称;
暂停以后,再查询容器的状态,状态为 PAUSE
:
root@doubibiji-server:~# ctr task ls
TASK PID STATUS
my-nginx2 1542 RUNNING
my-nginx 1260 PAUSED
root@doubibiji-server:~#
2
3
4
5
# 4.8 恢复容器任务
有暂停就有恢复,如果要恢复暂停容器,可以使用 ctr task resume
命令:
ctr task resume my-nginx
ctr task resume
:恢复容器的命令;my-nginx
:要恢复的容器名称;
恢复以后,再查询容器的状态,状态为 RUNNING
。
root@doubibiji-server:~# ctr task ls
TASK PID STATUS
my-nginx 1260 RUNNING
my-nginx2 1542 RUNNING
root@doubibiji-server:~#
2
3
4
5
暂停恢复容器,容器的 PID 不会发生变化。
# 4.9 停止容器任务
停止一个正在运行的容器,使用的是 kill
命令,结束进程。
# 停止容器
ctr task kill my-nginx
2
停止容器,容器还在,只是任务的状态变为停止:
root@doubibiji-server:~# ctr task ls
TASK PID STATUS
my-nginx2 1542 RUNNING
my-nginx 1260 STOPPED
root@doubibiji-server:~#
2
3
4
5
停止后,还可以使用 ctr task start
命令启动。
如果通过 ctr task kill
无法停止任务,可以使用 kill -9 PID
来停止。
# 4.10 删除任务任务
已经停止的任务,我们可以通过 ctr tasks rm
来删除任务。
# 可以使用delete, del, remove, rm命令,都可以
ctr tasks rm my-nginx
2
删除任务后,容器还是在的,还可以使用 ctr task start
命令重启启动容器。
如果是运行中的任务,是没有办法删除的,需要先停止容器。
# 4.11 删除容器
删除容器,首先要确保这个容器的任务没有在运行,先使用 ctr task ls
查看一下,看看能不能删除。
# 可以使用delete, del, remove, rm命令,都可以
ctr c rm my-nginx
2
删除完成,使用 ctr c ls
查看容器是否删除成功。
# 4.12 查看容器详细信息
如果要查看容器的详细信息,可以使用 ctr c info
命令:
# 查看my-nginx容器信息
ctr c info my-nginx
2
有点类似于 docker inspect
,详细信息类似如下:
root@doubibiji-server:~# ctr c info my-nginx
{
"ID": "my-nginx",
"Labels": {
"io.containerd.image.config.stop-signal": "SIGQUIT",
"maintainer": "NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e"
},
"Image": "docker.io/library/nginx:latest",
"Runtime": {
"Name": "io.containerd.runc.v2",
"Options": {
"type_url": "containerd.runc.v1.Options"
}
},
"SnapshotKey": "my-nginx",
"Snapshotter": "overlayfs",
"CreatedAt": "2024-03-28T15:42:48.377383087Z",
"UpdatedAt": "2024-03-28T15:42:48.377383087Z",
"Extensions": {},
"SandboxID": "",
// 信息太多,不方便展示
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21