1. 概述

    是我个人用C语言完全自研的容器引擎(对标Docker阿里Pouch),主要解决如下工作场景中的痛点:

    • 原生支持多进程架构的容器使用模式,无须引入第三方组件。
    • 按虚拟主机方式管理容器,交互式构建镜像,写过复杂Dockerfile的人都深恶痛绝。
    • 镜像多版本共存管理。

    cocker使用到了以下Linux底层技术:LXCcgroupoverlayfsiptablesptms等。

    在LXC中,容器只是内核命名空间隔离的根进程以及子进程树,隔离域有主机名字、进程空间、根文件系统、IPC、网络等。cocker完整的实现了以上所有隔离域,在容器管理设计上倾向于虚拟主机方式,也支持类似Docker的单进程方式。

    cocker自带了容器根进程,负责通过伪终端方式桥接容器内外,而不是必须通过ssh

    cgroup负责隔离域的系统资源管控,包括CPU、内存等。

    /projects/cocker/images/cocker_state_transition_diagram.png

    cocker镜像允许不同版本共存,创建容器时可以指定镜像版本,或者默认最新版。镜像可以复制和删除,也可以修改版本号。

    cocker容器创建出来后可以启动、关闭和销毁。修改容器属性如虚拟IP、端口映射和卷映射必须在容器关闭状态下进行。

    cocker镜像可以转化为cocker容器便于交互式修改,然后再转化回来。

    层叠文件系统是多镜像容器的存储基础,cocker采用overlayfs作为其层叠文件系统引擎,可以叠加几乎无限的镜像层。

    cocker的镜像和容器等都存放在环境变量COCKER_HOME指向的主目录中,所以规划其容量是使用前必须要考虑的问题。如果没有设置环境变量COCKER_HOME,则默认指向/var/cocker

    COCKER_HOME主目录中有镜像主目录images、容器主目录containers、镜像仓库srepo,以及日志文件cocker.log

    cocker支持三种网络模型:HOST、CUSTOM和BRIDGE。

    首次执行cocker会创建网桥设备cocker0,网段为166.88.0.x

    /projects/cocker/images/cocker_cgroup.png

    cocker目前只实现了CPU核分配、时间片占用百分比分配、内存分配,其它系统资源在后续版本中会逐渐完善。

    自带容器根进程接受客户端cocker连接后会创建伪终端会话,就像登录到虚拟主机上命令交互一样,无需使用ssh

    使用主控工具cocker快速创建一个小型测试镜像,里面调用了自带脚本cocker_install_test.sh构建根文件系统。