runc是linux上一个用来运行容器的管理工具,遵循OCI规范。
首先,我们通过一些简单的例子来演示一下runc创建和启动容器的例子:
mkdir /tmp/mycontainer
cd /tmp/mycontainer
# 创建容器文件系统
mkdir rootfs
# 导出busybox系统目录到rootfs
docker export $(docker create busybox) | tar -C rootfs -xvf -
下面来生成一个spec文件:config.json。runc提供一个一个spec命令帮助我们生成一个基础的模板,后续我们可以基于这个模板作出自定义的修改。
ruc spec
启动容器:
root@workstation:/tmp/testrunc# runc run mycontainer
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
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
/ # hostname
runc
/ #
这个run命令会帮助我们自动的删除容器,创建和启动容器。我们也可以通过单独的命令去做这些事情,下面进行演示。首先需要修改config.json,将其中的terminal改为false,并修改args为sleep 60。
"process": {
"terminal": false,
"user": {
"uid": 0,
"gid": 0
},
"args": [
"sleep", "60"
],
下面通过create命令启动容器:
root@workstation:/tmp/testrunc# runc create mycontainer
root@workstation:/tmp/testrunc# ps aux | grep runc
root 2557581 0.0 0.0 1081824 9736 ? Ssl 15:54 0:00 runc init
root 2557591 0.0 0.0 12320 2396 pts/0 S+ 15:54 0:00 grep --color=auto runc
可以看到runc帮助我们创建了容器,现在这个进程正在阻塞在写exec.fifo(默认在/var/run/runc/mycontainer/exec.fifo)这个文件,当我们执行runc start mycontainer时,这个进程会通过exec调用执行我们的用户命令sh。
root@workstation:/tmp/testrunc# runc start mycontainer
root@workstation:/tmp/testrunc# ps -axopid,ppid,cmd | grep 2558206
2558206 1 sleep 60
2558347 2556804 grep --color=auto 2558206
通过cat /var/run/runc/mycontainer/exec.fifo
同样可以实现容器的启动动作。