容器基本操作
容器基本操作主要是 ctr image 命令,查看命令帮助:
[root@localhost ~]# ctr containers -h
NAME:
ctr containers - Manage containers
USAGE:
ctr containers command [command options] [arguments...]
COMMANDS:
create Create container
delete, del, remove, rm Delete one or more existing containers
info Get info about a container
list, ls List containers
label Set and clear labels for a container
checkpoint Checkpoint a container
restore Restore a container from checkpoint
OPTIONS:
--help, -h show help
创建静态容器
create:
[root@localhost ~]# ctr container create docker.io/library/nginx:alpine nginx
nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。这个 container 对象只是包含了运行一个容器所需的资源及配置的数据结构,例如:namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程(本案例为nginx)还没有启动。需要使用ctr tasks命令才能获取一个动态容器。
查看容器
[root@localhost ~]# ctr container ls
CONTAINER IMAGE RUNTIME
nginx docker.io/library/nginx:alpine io.containerd.runc.v2
加上 -q 选项 仅查看名字:
[root@localhost ~]# ctr container ls -q
nginx
也可以简写:
[root@localhost ~]# ctr c ls -q
nginx
查看容器详细配置,类似于 docker inspect 功能。
[root@localhost ~]# ctr container info nginx
删除容器
[root@localhost ~]# ctr container rm nginx
[root@localhost ~]# ctr container ls
CONTAINER IMAGE RUNTIME
容器任务
上面我们通过 container create 命令创建的容器,并没有处于运行状态,只是一个静态的容器。一个 container 对象只是包含了运行一个容器所需的资源及相关配置数据,表示 namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程还没有启动。一个容器真正运行起来是由 Task 任务实现的,Task 可以为容器设置网卡,还可以配置工具来对容器进行监控等。我们操作容器实际上是对容器进程操作。
1.静态容器启动为动态容器
将静态容器启动为动态容器 ,使用 ctr task 命令 Task 相关操作可以通过 ctr task 获取,如下我们通过 Task 来启动容器:
[root@localhost ~]# ctr task start -d nginx
-d是一个命令行选项,它的全称是--detach。这个选项告诉ctr task start命令在启动任务后立即返回,让任务在后台运行。
2.查看容器进程
通过 task ls 查看正在运行的容器进程:
[root@localhost ~]# ctr task ls
TASK PID STATUS
nginx 22945 RUNNING
通过ps 查看,其中第一个 PID 23181 就是我们容器中的 1 号进程。
[root@localhost ~]# ctr task ps nginx
PID INFO
23181 -
23208 -
查看物理机进程,可以看到相应的进程ID:23181 、23208 可以对应的上:
[root@localhost ~]# ps -aux|grep nginx
root 23159 0.0 2.1 722644 20916 ? Sl 13:01 0:00 /usr/local/bin/containerd-shim-runc-v2 -namespace default -id nginx -address /run/containerd/containerd.sock
root 23181 0.0 0.5 8904 5120 ? Ss 13:01 0:00 nginx: master process nginx -g daemon off;
101 23208 0.0 0.2 9400 2256 ? S 13:01 0:00 nginx: worker process
root 23266 0.0 0.2 112836 2332 pts/3 S+ 13:15 0:00 grep --color=auto nginx
3.exec终端操作
[root@localhost ~]# ctr task exec --exec-id 0 -t nginx sh
/ # ls
bin docker-entrypoint.d etc lib mnt proc run srv tmp var
dev docker-entrypoint.sh home media opt root sbin sys usr
/ # pwd
/
这里要注意 --exec-id参数 为 exec 进程设定一个id,可以随意输入,只要保证唯一即可,也可使用$RANDOM变量。
4.运行一个动态容器
[root@localhost ~]# ctr run -d --net-host docker.io/library/nginx:alpine nginx2
[root@localhost ~]# ctr c ls
CONTAINER IMAGE RUNTIME
nginx docker.io/library/nginx:alpine io.containerd.runc.v2
nginx2 docker.io/library/nginx:alpine io.containerd.runc.v2
[root@localhost ~]# ctr task ls
TASK PID STATUS
nginx 23181 RUNNING
nginx2 23339 RUNNING
- -d 代表dameon,后台运行
- --net-host 代表容器的IP就是宿主机的IP(相当于docker里的host类型网络)
5.进入容器
[root@localhost ~]# ctr task exec --exec-id 1 -t nginx2 /bin/sh
/ # ifconfig
eno16777736 Link encap:Ethernet HWaddr 00:0C:29:AD:FC:E9
inet addr:192.168.36.137 Bcast:192.168.36.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fead:fce9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2304427 errors:0 dropped:0 overruns:0 frame:0
TX packets:462774 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3259139229 (3.0 GiB) TX bytes:182005861 (173.5 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:696 (696.0 B) TX bytes:696 (696.0 B)
/ # curl 192.168.36.137
<!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>
暂停容器进程
和 docker pause 类似的功能:
[root@localhost ~]# ctr task pause nginx
暂停后容器状态变成了 PAUSED:
[root@localhost ~]# ctr task ls
TASK PID STATUS
nginx 22945 PAUSED
恢复容器进程
使用 resume 命令来恢复容器:
[root@localhost ~]# ctr task resume nginx
[root@localhost ~]# ctr task ls
TASK PID STATUS
nginx 22945 RUNNING
杀死容器进程
ctr 没有 stop 容器的功能,只能暂停或者杀死容器进程,然后在删除容器杀死容器进程可以使用 task kill 命令:
[root@localhost ~]# ctr task kill nginx
[root@localhost ~]# ctr task ls
TASK PID STATUS
nginx 22945 STOPPED
删除进程
杀掉容器后可以看到容器的状态变成了 STOPPED。同样也可以通过 task rm 命令删除 Task:
[root@localhost ~]# ctr task rm nginx
[root@localhost ~]# ctr task ls
TASK PID STATUS
删除进程之后才可以删除容器:
[root@localhost ~]# ctr c rm nginx
查看容器进程资源
除此之外我们还可以获取容器的 cgroup 相关信息,可以使用 task metrics 命令用来获取容器的内存、CPU 和 PID 的限额与使用量。
# 重新启动容器
[root@localhost ~]# ctr task start -d nginx
[root@localhost ~]# ctr task metrics nginx
ID TIMESTAMP
nginx seconds:1701925304 nanos:694970440
METRIC VALUE
memory.usage_in_bytes 2592768
memory.limit_in_bytes 9223372036854771712
memory.stat.cache 258048
cpuacct.usage 21976291
cpuacct.usage_percpu [21976291 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
pids.current 2
pids.limit 0