参考《自己动手写 docker》从零开始实现一个简易的 docker 以及配套教程。
具体差异如下:
- UnionFS替换:从AUFS 替换为 Overlayfs
- 依赖管理更新:从 go vendor 替换为 Go Module
- 一些写法上的优化调整
建议先了解一下 Docker 的核心原理大致分析,可以看这篇文章:Docker教程(三)---核心实现原理分析。
核心原理一共包含以下三个点:
- 1)Namespace
- 2)Cgroups
- 3)UnionFS
本章构造了一个简单的容器,具有基本的 Namespace 隔离,确定了基本的开发架构,后续在此基础上继续完善即可。
本章首先使用 busybox 作为基础镜像创建了一个容器,理解了什么是 rootfs,以及如何使用 rootfs 来打造容器的基本运行环境。
然后,使用 OverlayFS 来构建了一个拥有二层模式的镜像,对于最上层可写层的修改不会影响到基础层。这里就基本解释了镜像分层存储的原理。
之后使用 -v 参数做了一个 volume 挂载的例子,介绍了如何将容器外部的文件系统挂载到容器中,并且让它可以访问。
最后实现了一个简单版本的容器镜像打包。
这一章主要针对镜像的存储及文件系统做了基本的原理性介绍,通过这几个例子,可以很好地理解镜像是如何构建的,第 5 章会基于这些基础做更多的扩展。
本章实现了容器操作的基本功能。
- 首先实现了容器的后台运行,然后将容器的状态在文件系统上做了存储。
- 通过这些存储信息,又可以实现列出当前容器信息的功能。
- 并且, 基于后台运行的容器,我们可以去手动停止容器,并清除掉容器的存储信息。
- 最后修改了上一章镜像的存储结构,使得多个容器可以并存,且存储的内容互不干扰。
refactor: 文件系统重构,为不同容器提供独立的rootfs. feat: 更新rm命令,删除容器时移除对应文件系统. feat: 更新commit命令,实现对不同容器打包.
05-8 实现环境变量注入功能:mydocker run -e
在这一章中,首先手动给一个容器配置了网路,并通过这个过程了解了 Linux 虚拟网络设备和操作。然后构建了容器网络的概念模型和模块调用关系、IP 地址分配方案,以及网络模块的接口设计和实现,并且通过实现 Bridge 驱动给容器连上了“网线”。