使用runc与oci-image-tool运行容器


本文描述了如何使用skopeo下载镜像,使用oci-image-tool打包/创建bundle以及使用runc运行容器。参考如何绕过docker运行hello-world什么是容器的runtime?以及容器镜像规范。环境: Ubuntu 18.04.

skopeo下载镜像

skopeo需要从源码安装,要求Go1.9以上版本。对于Go语言的安装,参考上一篇Golang配置与runc源码build小记。skopeo的使用参考skopeo,这里使用如下命令,从dockerhub上获取busybox与alpine的最新镜像:

skopeo copy docker://busybox:latest oci:busybox
skopeo copy docker://alpine:latest oci:alpine

执行完后会当前目录的busybox和alpine两个文件夹即是下载的镜像。

oci-image-tool解压、创建镜像

  • oci-image-tool unpack 命令可以将镜像解包为文件系统
    eric@ubuntu:~$ oci-image-tool unpack --ref platform.os=linux alpine alpine-fs                                           
    eric@ubuntu:~$ ls alpine-fs/                                                                                           
    bin  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var                              
    
    可以看到alpine镜像的文件系统
  • oci-image-tool create 可以创建OCI格式的bundle
    eric@ubuntu:~$ oci-image-tool create --ref platform.os=linux alpine alpine-bundle
    eric@ubuntu:~$ ls alpine-bundle/                                                                                        
    config.json  rootfs 
    
    生成的bundle中包含一个配置文件config.json以及一个根文件系统rootfs

命令中的--ref platform.os=linux尚不了解,可以参考oci-image-tool-create手册, config.json文件的内容可以参考Configuration

这里使用上述命令分别创建busybox与alpine的运行时bundle.

eric@ubuntu:~$ oci-image-tool create --ref platform.os=linux busybox busybox-bundle
eric@ubuntu:~$ ls busybox-bundle/                        
config.json  rootfs
eric@ubuntu:~$ oci-image-tool create --ref platform.os=linux alpine alpine-bundle
eric@ubuntu:~$ ls alpine-bundle/                                                                                        
config.json  rootfs 

runc运行容器

  • 使用sudo apt install runc命令即可安装
  • 安装后,进入到bundle文件夹运行,由于未知原因(版本?)需要改一下config.json
    • 删除原有的config.json
    • 使用runc spec创建一个新的config.json文件
    • 修改文件中uidgid的值,不清楚这一步的原因,可能因为我使用的是编译出的可执行文件
  • 使用sudo runc run hello即可运行容器
    • 如果不在bundle文件夹中,则需要通过-b bundle参数指定文件夹
    • hello为容器名称

如下为运行结果:

eric@ubuntu:~/images/alpine-bundle$ sudo ../runc run hello                                                              
/ $ ls                                                                                                                  
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var     

内存使用情况

在另一个终端窗口中运行ps -aux命令可以查看所有进程的内存使用量情况,如下为部分信息,其中VSZ为虚拟内存大小,RSS为常驻集大小。VSZ表示如果一个程序完全驻留在内存的话需要占用多少内存空间,而RSS指明了当前实际占用了多少内存。

  • busybox
      USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root       5764  0.0  0.2  64320  4360 pts/0    S+   16:30   0:00 sudo ./runc run -b busybox-bundle/ hello
      root       5765  0.0  0.6 717808 13436 pts/0    Sl+  16:30   0:00 ./runc run -b busybox-bundle/ hello
      eric       5790  0.0  0.0   1308     4 pts/0    Ss+  16:30   0:00 sh
    
  • alpine
      USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root       6158  0.0  0.2  64320  4236 pts/0    S+   16:41   0:00 sudo ../runc run -b alpine-bundle/ hello
      root       6159  0.0  0.6 717808 13460 pts/0    Sl+  16:41   0:00 ../runc run -b alpine-bundle/ hello
      eric       6184  0.0  0.0   1628  1096 pts/0    Ss+  16:41   0:00 sh
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章