# 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
