BATJ架构

Docker容器引擎runC执行框架

2019-05-12  本文已影响1人  裘马轻狂大帅

根据官方的定义:runC是一个根据OCI标准创建并运行容器的CLI tool。

Docker就是基于runC创建的,简单地说,runC是Docker中最为核心的部分,容器的创建,运行,销毁等等操作最终都将通过调用runC完成。下面我们将演示如何使用runC,以最精简的方式创建并运行一个容器。

下载并编译

# create a 'github.com/opencontainers' in your GOPATH/src
cd github.com/opencontainers
git clone https://github.com/opencontainers/runc
cd runc
make
sudo make install

创建容器的根文件系统

# create the top most bundle directory

mkdir /mycontainer

cd /mycontainer

# create the rootfs directory

mkdir rootfs

# export busybox via Docker into the rootfs directory

docker export $(docker create busybox) | tar -C rootfs -xvf -

利用runC的spec命令创建默认的配置文件config.json,其中包含了创建一个容器所需的所有配置信息

runc spec
利用runC运行busybox容器

# run as root

cd /mycontainer

runc run mycontainerid

/ # ls

bin  dev  etc  home  proc  root  sys  tmp  usr  var

可以看到,容器成功运行,此时我们打开另一个终端观察容器的运行状态

runc list

ID              PID        STATUS      BUNDLE        CREATED                          OWNER

mycontainerid  1070        running    /mycontainer  2019-05-11T12:26:30.159978871Z  root

事实上,runc run是一个复合命令,它包含了容器的创建runc create,启动runc start以及在退出之后对容器进行的销毁runc delete,从演示的角度看它是最为直观的。但是如果想要深入理解runC内部的实现机制,将容器的创建,启动,销毁三个步骤分开,显然会让整个过程的分析更为简单和易于接受

下面我们就将结合源码,对整个容器技术最为核心的部分进行探究—— 容器是如何创建并启动的

可以看到在runC的顶层目录中,有着一系列形如create.go, start.go, run.go…的go文件,它们和runC的子命令,例如runc create...,runc start...,runc run是一致的。 另外,在顶层目录中还有一个名为libcontainer的子目录。对于Docker项目的发展历史有所了解的同学应该都知道,libcontainer曾经是Docker中最为核心的包,容器的创建,删除等一系列工作,最终都是交由它来完成的。

这样一来,runC的代码结构就非常清晰了。我们知道,runC是符合OCI标准的容器运行时。不难猜出,它本质上是对libcontainer的一层薄薄的封装。它会先读取符合OCI标准的容器配置,再将其转换成与libcontainer兼容的格式,最后将转换后的配置交由libcontainer来完成具体的工作。

上一篇下一篇

猜你喜欢

热点阅读