# containerd教程 - 4 容器管理

好了,有了镜像了,可以通过镜像来运行容器了。

关于容器操作的命令可以使用:ctr containersctr containerctr c ,这三个命令是一样的,后面容器的操作,使用这三个都可以。

注意,下面创建和操作容器的时候,容器是没有网络的,所以容器没有办法通过网络和外部进行交互。

# 4.1 创建容器

在创建容器之前,首先要下载容器的镜像,否则会提示找不到镜像,而不是帮你下载。

首先下载一个 nginx 镜像:

ctr images pull docker.io/library/nginx:latest
1

创建容器使用 create 命令:

ctr c create docker.io/library/nginx:latest my-nginx
1
  • ctr c create :创建容器的命令;
  • docker.io/library/nginx:latest :镜像名称;
  • my-nginx :创建的容器名称,自己定义。

注意:使用 create 命令创建容器后,并没有启动容器。

# 4.2 查看容器

查看容器使用 ls 命令。

ctr c ls
1

会显示容器名称,容器使用的镜像等信息。

但是通过 ctr c ls 命令并不能看到容器是否运行。

# 4.3 查看任务

要查看容器是否运行,需要使用 ctr task 命令:

ctr task ls
# 或者
ctr t ls
1
2
3

ctr task 命令会列出所有正在运行的任务,也就是容器。(在 containerd 的上下文中,任务通常指的是一个正在运行的容器实例)。

此时还没有启动容器,所以执行 ctr task ls,没有任务显示

# 4.4 启动容器

上面已经创建容器,但是没有启动,启动或启动一个已停止的容器,可以使用 start 命令:

ctr task start -d my-nginx
1
  • ctr task start :启动容器的命令;
  • -d :后台运行,否在在终端中运行,ctrl + c 容器就停止了;
  • my-nginx :容器名称。

注意这里启动的是任务,启动容器也就是启动任务,启动后,就可以查看任务了:

可以看到 my-nginx 容器运行 RUNNING 起来了。

任务的 PID 是容器在宿主机上的进程,可以使用如下命令查看:

ps -ef|grep <PID>
1

# 4.5 创建并启动容器

前面创建容器,然后再启动,有些麻烦,我们可以直接创建并启动容器,使用 run 命令即可:

ctr run -d docker.io/library/nginx:latest my-nginx2
1
  • 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:~# 
1
2
3
4
5

# 4.6 进入和退出容器

如果想要进入容器内部执行一些操作,可以使用如下命令:

# 进入 my-nginx 内部
ctr task exec --exec-id $RANDOM -t my-nginx /bin/sh
1
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>
# 
1
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
1
  • 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:~# 
1
2
3
4
5

# 4.8 恢复容器任务

有暂停就有恢复,如果要恢复暂停容器,可以使用 ctr task resume 命令:

ctr task resume my-nginx
1
  • 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:~# 
1
2
3
4
5

暂停恢复容器,容器的 PID 不会发生变化。

# 4.9 停止容器任务

停止一个正在运行的容器,使用的是 kill 命令,结束进程。

# 停止容器
ctr task kill my-nginx 
1
2

停止容器,容器还在,只是任务的状态变为停止:

root@doubibiji-server:~# ctr task ls
TASK         PID     STATUS    
my-nginx2    1542    RUNNING
my-nginx     1260    STOPPED
root@doubibiji-server:~# 
1
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
1
2

删除任务后,容器还是在的,还可以使用 ctr task start 命令重启启动容器。

如果是运行中的任务,是没有办法删除的,需要先停止容器。

# 4.11 删除容器

删除容器,首先要确保这个容器的任务没有在运行,先使用 ctr task ls 查看一下,看看能不能删除。

# 可以使用delete, del, remove, rm命令,都可以
ctr c rm my-nginx
1
2

删除完成,使用 ctr c ls 查看容器是否删除成功。

# 4.12 查看容器详细信息

如果要查看容器的详细信息,可以使用 ctr c info 命令:

# 查看my-nginx容器信息
ctr c info my-nginx
1
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": "",
    // 信息太多,不方便展示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21