美文网首页BATJ架构
Docker容器引擎runC执行框架

Docker容器引擎runC执行框架

作者: 裘马轻狂大帅 | 来源:发表于2019-05-12 09:10 被阅读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来完成具体的工作。

    相关文章

      网友评论

        本文标题:Docker容器引擎runC执行框架

        本文链接:https://www.haomeiwen.com/subject/cpbqaqtx.html