使用runc創建一個docker容器案例

runc 是 docker 捐贈給 OCI 的一個符合標準的 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章