老哈 发表于 2021-3-9 10:30:18

容器系列-1使用runc管理容器

当我们用docker创建容器的时候,docker最终是通过runc来完成容器管理的。# docker infoClient:    ...大量输出... Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc Default Runtime: runc    ...大量输出...#从这里可以看到docker默认使用runc作为runtime的。那么什么是runtime(运行时)呢?所谓的runtime说白了就是能管理容器的东西就叫做runtime。docker是runtime,runc是runtime,podman是runtime,lxc也是runtime。但是刚才说,docker默认使用runc作为默认的runtime又是什么意思呢?这里就涉及到了两个概念low-level runtime和high-level runtime。所谓的low-level runtime(低级别运行时)指的是只能单一的管理容器,不具备管理存储、镜像等能力,比如runc,lxc,gVisor,kata等都属于低级别runtime。高级别runtime不仅能管理容器,还能管理存储、镜像等。而管理容器时需要调用低级别runtime来实现容器的管理。比如docker、podman、containerd都属于高级别runtime。docker默认使用runc作为runtime,如果要使用其他低级别runtime的话,在创建容器时需要加上--runtime来指定使用哪个低级本runtime(前提要安装好对应的runtime),如下图:
http://www.rhce.cc/wp-content/uploads/2021/02/1613217645-image-1613217645037.png本节演示runc如何管理容器。
因为runc不具备镜像管理能力,所以先用docker把busybox镜像下载下来。
步骤1:下载镜像busybox# docker pull busyboxUsing default tag: latestlatest: Pulling from library/busyboxe5d9363303dd: Pull complete Digest: sha256:c5439d7d...1d7596d2126dfb5b02bfd1fStatus: Downloaded newer image for busybox:latestdocker.io/library/busybox:latest#步骤2:使用docker创建一个容器出来# docker run -dit --name=c1 busybox c769a24823abb2271f78...552176d21f44e02397df0#步骤3:导出容器为c1.tar# docker export c1 > c1.tar# lsanaconda-ks.cfgc1.tar这个文件c1.tar里包含了运行一个容器所需要的所有数据,有了这些数据runc才能创建容器。步骤4:创建一个目录/c1/rootfs# mkdir -p/c1/rootfs#注意这里/c1名字可以随意命名,rootfs这个名字是默认的名字,此处如果rootfs是其他名字的话需要在后续生成的config.json里指定。步骤5:把c1.tar解档到/c1/rootfs里# tar xf c1.tar -C /c1/rootfs# ls /c1/rootfsbindevetchomeprocrootsystmpusrvar#为了测试方便,在/c1/rootfs/里创建aa.txt# touch /c1/rootfs/aa.txt# ls /c1/rootfs/aa.txtbindevetchomeprocrootsystmpusrvar# 步骤6:生成runc创建文件的config.json文件# cd /c1/# lsrootfs# runc spec# lsconfig.jsonrootfs#修改config.json的内容1 {2         "ociVersion": "1.0.2-dev",3         "process": {4               "terminal": false,5               "user": {6                         "uid": 0,7                         "gid": 08               },把第4行terminal: true改为terminal: false。 53         "root": { 54               "path": "rootfs", 55               "readonly": true第53行path设置的是rootfs,前面创建/c1/rootfs里的rootfs名字就是在这里定义的。步骤7:使用runc创建容器# runc create c1# runc listID   PID   STATUS   BUNDLE   CREATED                     OWNERc1   2741   created    /c1   2021-02-13T03:13:32.724746332Z   root# 步骤8:进入到容器内部# runc exec-tc1 /bin/sh/ # / # ls /aa.txtbin   dev   etc   homeprocrootsys   tmp   usr   var/ # exit#步骤9:删除容器# runc delete c1# runc listID          PID         STATUS      BUNDLE      CREATED   OWNER#

zxh728 发表于 2021-8-3 15:39:46

谢谢分享!

zxh728 发表于 2021-8-6 11:02:10

谢谢分享!
页: [1]
查看完整版本: 容器系列-1使用runc管理容器