0D1Lee0 / mydocker

参考《自己动手写 docker》从零开始实现一个简易的 docker 以及相关教程。Build a simple Docker from scratch along with related tutorials.

Home Page:https://www.lixueduan.com/categories/docker/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

mydocker

1. 概述

参考《自己动手写 docker》从零开始实现一个简易的 docker 以及配套教程。

具体差异如下:

  • UnionFS替换:从AUFS 替换为 Overlayfs
  • 依赖管理更新:从 go vendor 替换为 Go Module
  • 一些写法上的优化调整

微信公众号:探索云原生

鸽了很久之后,终于开通了,欢迎关注。

一个云原生打工人的探索之路,专注云原生,Go,坚持分享最佳实践、经验干货。

扫描下面的二维码关注我的微信公众帐号,一起探索云原生吧~

从零开始写 Docker 系列持续更新中,关注我即时获取更新~

个人博客:指月小筑(探索云原生)

在线阅读:指月小筑(探索云原生)

2. 基础知识

推荐阅读以下文章对 Docker 核心原理有一个大致认识:

通过上述文章,大家对 Docker 的实现原理已经有了初步的认知,接下来我们就用 Golang 手动实现一下自己的 docker(mydocker)。

3. 具体实现

构造容器

本章构造了一个简单的容器,具有基本的 Namespace 隔离,确定了基本的开发架构,后续在此基础上继续完善即可。

第一篇:

第二篇:

第三篇:

构造镜像

本章首先使用 busybox 作为基础镜像创建了一个容器,理解了什么是 rootfs,以及如何使用 rootfs 来打造容器的基本运行环境。

然后,使用 OverlayFS 来构建了一个拥有二层模式的镜像,对于最上层可写层的修改不会影响到基础层。这里就基本解释了镜像分层存储的原理。

之后使用 -v 参数做了一个 volume 挂载的例子,介绍了如何将容器外部的文件系统挂载到容器中,并且让它可以访问。

最后实现了一个简单版本的容器镜像打包。

这一章主要针对镜像的存储及文件系统做了基本的原理性介绍,通过这几个例子,可以很好地理解镜像是如何构建的,第 5 章会基于这些基础做更多的扩展。

第四篇:

第五篇:

第六篇:

第七篇:

构建容器进阶

本章实现了容器操作的基本功能。

  • 首先实现了容器的后台运行,然后将容器的状态在文件系统上做了存储。
  • 通过这些存储信息,又可以实现列出当前容器信息的功能。
  • 并且, 基于后台运行的容器,我们可以去手动停止容器,并清除掉容器的存储信息。
  • 最后修改了上一章镜像的存储结构,使得多个容器可以并存,且存储的内容互不干扰。

第八篇:

第九篇:

第十篇:

第十一篇:

第十二篇:

第十三篇:

第十四篇:

refactor: 文件系统重构,为不同容器提供独立的rootfs. feat: 更新rm命令,删除容器时移除对应文件系统. feat: 更新commit命令,实现对不同容器打包.


05-8 实现环境变量注入功能:mydocker run -e

容器网络

在这一章中,首先手动给一个容器配置了网路,并通过这个过程了解了 Linux 虚拟网络设备和操作。然后构建了容器网络的概念模型和模块调用关系、IP 地址分配方案,以及网络模块的接口设计和实现,并且通过实现 Bridge 驱动给容器连上了“网线”。

06-1-网络虚拟化技术

06-2-构建容器网络模型

06-3-容器地址分配

06-4-创建Bridge网络

06-5-在Bridge网络创建容器

About

参考《自己动手写 docker》从零开始实现一个简易的 docker 以及相关教程。Build a simple Docker from scratch along with related tutorials.

https://www.lixueduan.com/categories/docker/

License:MIT License


Languages

Language:Go 99.4%Language:Makefile 0.6%