目前Docker是风靡一时的容器项目,学习Docker的实现原理无论对于使用还是云计算相关的二次开发都非常重要。就原理学习而言,要么是源码阅读,要么是动手造轮子,而前者往往过于枯燥,且容易造成深度不足。本项目是通过造轮子的方式来学习Docker,命名为Capsule,由Go语言开发,主要由两部分组成,一部分是模仿了runC,实现了部分的OCI标准规范,即容器的CRUD操作与生命周期管理,另一部分是模仿了Docker,实现了容器网络与镜像管理。
    Capsule基本实现了以下功能:

    • namespace 支持, 包括 uts, pid, mount, network,暂不支持user ns
    • control group(linux cgroups) 支持,目前仅支持cpu与memory的控制
    • 支持运行在用户提供的root fs上
    • 容器网络, 包括容器间网络、容器与宿主机间网络、容器与外部网络
    • 丰富的容器CLI命令支持, 包括 list, state, create, run, start, kill, delete, exec, ps, logspec.
    • 镜像管理,包括镜像导入(由Docker导出的镜像),以类似于Docker CLI的方式运行容器(即不需要提供OCI标准的config.json)

    Capsule项目开发中使用了Linux的Namespace与Cgroup技术,实现了资源隔离与资源限制;基于pivot_root实现了容器以指定目录作为rootfs;基于Linux网络API与iptables实现了容器间、容器与宿主机间、容器与外部网络间的网络连通;基于UnionFS实现了Copy-On-Write的rootfs,支持基于镜像的容器运行。
    本人独立开发了此项目,以大概5500行代码模拟了Docker的部分核心功能,验收标准是可以以容器的方式,以类似于Docker的用法,来运行一个Spring Boot+MySQL+Redis的应用。