runc 是 docker 捐赠给 OCI 的亚博体育(yabo618點cn)一个符合标准的 runtime 实现,目前 docker 引擎内部也是基于 runc 构建的。分析 runc 这个项目,加深对 OCI 的理解。
1.先创建以容器的目录,例如mycontainer
mkdir mycontainer
2.准备一个rootfs的目录,供初始化一个容器所需要的的文件系统
cd mycontainer
mdkir rootfs
docker export $(docker create busybox) | tar -C rootfs -xvf -
查看下载的文件系统
[root@docker2 mycontainer]# ll rootfs/
总用量 16
drwxr-xr-x 2 root root 12288 5月 9 2019 bin
drwxr-xr-x 4 root root 43 3月 6 21:41 dev
drwxr-xr-x 3 root root 139 3月 6 21:41 etc
drwxr-xr-x 2 65534 65534 6 5月 9 2019 home
drwxr-xr-x 2 root root 6 3月 6 21:41 proc
drwx------ 2 root root 6 5月 9 2019 root
drwxr-xr-x 2 root root 6 3月 6 21:41 sys
drwxrwxrwt 2 root root 6 5月 9 2019 tmp
drwxr-xr-x 3 root root 18 5月 9 2019 usr
drwxr-xr-x 4 root root 30 5月 9 2019 var
3.生成一个config.json文件告诉runc如何运行一个容器,准备容器运行时的标准
[root@docker2 mycontainer]# runc spec
[root@docker2 mycontainer]# ll
总用量 4
-rw-r--r-- 1 root root 2618 3月 6 21:41 config.json
drwxr-xr-x 12 root root 137 3月 6 21:41 rootfs
查看config.json的内容,内容较长就不展示了
more /run/runc/box/state.json | python -mjson.tool
4.使用runc运行一个容器
[root@docker2 mycontainer]# runc run box(容器的名称)
/ # ls
bin dev etc home proc root sys tmp usr var
/ # hostname
runc
/ # whoami
root
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
/ #
5.在其他的虚拟终端查看容器的运行信息
[root@docker2 ~]# runc list
ID PID STATUS BUNDLE CREATED OWNER
box 31158 running /root/mycontainer 2020-03-06T13:44:24.565967666Z root
目前,在我的机器上,runc 会把容器的运行信息保存在 /run/runc 目录下:
[root@docker2 ~]# tree /run/runc/
/run/runc/
└── box
└── state.json
1 directory, 1 file
除了 run 命令之外,我们也能通过create、start、stop、kill 等命令对容器状态进行更精准的控制。继续实验,因为接下来要在后台模式运行容器,所以需要对 config.json 进行修改。改动有两处,把 terminal 的值改成 false,修改 args 命令行参数为 sleep 20:
"process": {
"terminal": false,
"user": {
"uid": 0,
"gid": 0
},
"args": [
"sh"
],
接着,用 runc 子命令来控制容器的运行,实现各个容器状态的转换:
kill容器
[root@docker2 mycontainer]# runc kill box KILL
[root@docker2 mycontainer]# runc list
ID PID STATUS BUNDLE CREATED OWNER
// 使用 create 创建出容器,此时容器并没有运行,只是准备好了所有的运行环境// 通过 list 命令可以查看此时容器的状态为 `created`➜ runc create mycontainerid➜ runc list
ID PID STATUS BUNDLE CREATED OWNER
mycontainerid 15871 created /home/cizixs/Workspace/runc/mycontainer 2017-11-02T08:05:50.658423519Z root// 运行容器,此时容器会在后台运行,状态变成了 `running`➜ runc start mycontainerid➜ runc list
ID PID STATUS BUNDLE CREATED OWNER
mycontainerid 15871 running /home/cizixs/Workspace/runc/mycontainer 2017-11-02T08:05:50.658423519Z root// 等待一段时间(20s)容器退出后,可以看到容器状态变成了 `stopped`➜ runc list
ID PID STATUS BUNDLE CREATED OWNER
mycontainerid 0 stopped /home/cizixs/Workspace/runc/mycontainer 2017-11-02T08:05:50.658423519Z root// 删除容器,容器的信息就不存在了➜ runc delete mycontainerid➜ runc list
ID PID STATUS BUNDLE CREATED OWNER