参考《自己动手写 docker》,自己动手从零开始实现一个简易的 docker 以及配套教程。
再次感谢几位作者大佬
具体差异如下:
- UnionFS替换:从AUFS 替换为 Overlayfs
- 依赖管理更新:从 go vendor 替换为 Go Module
- 一些写法上的优化调整
鸽了很久之后,终于开通了,欢迎关注。
一个云原生打工人的探索之路,专注云原生,Go,坚持分享最佳实践、经验干货。
从零开始写 Docker
系列持续更新中,扫描下面二维码,关注我即时获取更新~
在线阅读:指月小筑(探索云原生)
推荐阅读以下文章对 Docker 核心原理有一个大致认识:
- 核心原理:深入理解 Docker 核心原理:Namespace、Cgroups 和 Rootfs
- 基于 namespace 的视图隔离:探索 Linux Namespace:Docker 隔离的神奇背后
- 基于 cgroups 的资源限制
- 基于 overlayfs 的文件系统:Docker 魔法解密:探索 UnionFS 与 OverlayFS
- 基于 veth pair、bridge、iptables 等等技术的 Docker 网络:揭秘 Docker 网络:手动实现 Docker 桥接网络
通过上述文章,大家对 Docker 的实现原理已经有了初步的认知,接下来我们就用 Golang 手动实现一下自己的 docker(mydocker)。
本章构造了一个简单的容器,具有基本的 Namespace 隔离,确定了基本的开发架构,后续在此基础上继续完善即可。
第一篇:
第二篇:
第三篇:
本章首先使用 busybox 作为基础镜像创建了一个容器,理解了什么是 rootfs,以及如何使用 rootfs 来打造容器的基本运行环境。
然后,使用 OverlayFS 来构建了一个拥有二层模式的镜像,对于最上层可写层的修改不会影响到基础层。这里就基本解释了镜像分层存储的原理。
之后使用 -v 参数做了一个 volume 挂载的例子,介绍了如何将容器外部的文件系统挂载到容器中,并且让它可以访问。
最后实现了一个简单版本的容器镜像打包。
这一章主要针对镜像的存储及文件系统做了基本的原理性介绍,通过这几个例子,可以很好地理解镜像是如何构建的,第 5 章会基于这些基础做更多的扩展。
第四篇:
第五篇:
第六篇:
第七篇:
本章实现了容器操作的基本功能。
- 首先实现了容器的后台运行,然后将容器的状态在文件系统上做了存储。
- 通过这些存储信息,又可以实现列出当前容器信息的功能。
- 并且, 基于后台运行的容器,我们可以去手动停止容器,并清除掉容器的存储信息。
- 最后修改了上一章镜像的存储结构,使得多个容器可以并存,且存储的内容互不干扰。
第八篇:
第九篇:
第十篇:
第十一篇:
第十二篇:
第十三篇:
第十四篇:
refactor: 文件系统重构,为不同容器提供独立的rootfs. feat: 更新rm命令,删除容器时移除对应文件系统. feat: 更新commit命令,实现对不同容器打包.
第十五篇:
在这一章中,首先手动给一个容器配置了网路,并通过这个过程了解了 Linux 虚拟网络设备和操作。然后构建了容器网络的概念模型和模块调用关系、IP 地址分配方案,以及网络模块的接口设计和实现,并且通过实现 Bridge 驱动给容器连上了“网线”。
前置:揭秘 Docker 网络:手动实现 Docker 桥接网络
第十七篇:
第十八篇:
第十九篇:
最后打个广告,扫描下面二维码,关注我即时获取更多文章~