runc 算是 runtime caller参考实现 ,不过用的确实很多。

当然了,这是个底层工具,设计时也没考虑到终端用户,所以以下内容仅作为参考(乐子)看。


  1. 下载一个喜欢的镜像,比如 busybox

用 docker 是因为方便,其他的也行

1
docker pull busybox
  1. 创建 bundle
1
2
3
4
5
6
7
8
9
10
11
mkdir ~/mybusybox
cd ~/mybusybox

# create the rootfs directory
mkdir rootfs

# export busybox via Docker into the rootfs directory
docker export $(docker create busybox) | tar -C rootfs -xvf -

# create `config.json` by runc
runc spec
  1. 运行该容器 run

run 命令会处理容器的创建,启动和删除。

1
2
# At ~/mybusybox
runc run [container-id] # like 123456789, whatever
  1. 运行该容器 manual

先修改一下 config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
"process": {
- "terminal": true
+ "terminal": false
"user": {
"uid": 0,
"gid": 0
},
"args": [
- "sh"
+ "sleep", "5"
],
...
}

现在可以完成生命周期操作了

4.1. 创建容器

1
2
# ~/mybusybox
sudo runc create [container-id]

查看容器状态:

1
sudo runc list
1
2
ID          PID         STATUS      BUNDLE                                            CREATED                          OWNER
12345699 2201396 created /home/user/github.com/Guaderxx/runc/mybusybox 2024-04-23T09:33:42.994710154Z root

4.2. 运行容器

运行容器,容器会在 5S 内结束,sleep 期间可以查看容器状态

1
sudo runc start [container-id] # 比如我这里是 12345699

运行时容器状态:

1
2
ID          PID         STATUS      BUNDLE                                            CREATED                          OWNER
12345699 2201396 running /home/user/github.com/Guaderxx/runc/mybusybox 2024-04-23T09:33:42.994710154Z root

结束后容器状态:

1
2
ID          PID         STATUS      BUNDLE                                            CREATED                          OWNER
12345699 0 stopped /home/user/github.com/Guaderxx/runc/mybusybox 2024-04-23T09:33:42.994710154Z root

4.3. 删除容器

1
sudo runc delete [container-id] 

此时再查看容器状态,可以发现已经看不到了。