runc 是 docker 捐贈給 OCI 的一個符合標準的 runtime 實現,目前 docker 引擎內部也是基於 runc 構建的。分析 runc 這個項目,加深對 OCI 的理解。python
1.先建立以容器的目錄,例如mycontainerdocker
mkdir mycontainer
2.準備一個rootfs的目錄,供初始化一個容器所須要的的文件系統
json
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如何運行一個容器,準備容器運行時的標準
bash
[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的內容,內容較長就不展現了
ide
more /run/runc/box/state.json | python -mjson.tool
4.使用runc運行一個容器
oop
[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.在其餘的虛擬終端查看容器的運行信息
ui
[root@docker2 ~]# runc listspa
ID PID STATUS BUNDLE CREATED OWNER命令行
box 31158 running /root/mycontainer 2020-03-06T13:44:24.565967666Z rootorm
目前,在個人機器上,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