liulangwa / mydocker

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

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

mydocker

1. 概述

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

具体差异如下:

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

建议先了解一下 Docker 的核心原理大致分析,可以看这篇文章:Docker教程(三)---核心实现原理分析

核心原理一共包含以下三个点:

  • 1)Namespace
  • 2)Cgroups
  • 3)UnionFS

2. 基础知识

Namespace

namespace 初体验

Cgroups

Cgroups-1-初体验

Cgroups-2-subsystem演示

Cgroups-3-相关命令汇总及Go Demo

UnionFS

ufs-1-初体验

ufs-2-overlayfs2

ufs-3-docker文件系统

3. 具体实现

构造容器

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

3-1 实现 mydocker run 命令

3-2 增加Cgroups实现资源限制

构造镜像

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

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

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

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

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

04-1-使用busybox做rootfs

04-2-overlayfs

04-3-实现数据卷挂载 mydocker -v

04-4-实现简单镜像打包 mydocker commit

构建容器进阶

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

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

05-1-实现容器后台运行:mydocker run -d

05-2-实现查看运行中的容器:mydocker ps

05-3-实现查看容器日志:mydocker log

05-4-实现进入容器:mydocker exec

05-5-实现停止容器:mydocker stop

05-6-实现删除容器:mydocker rm

05-7-文件系统重构

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 以及相关教程。

License:MIT License


Languages

Language:Go 99.4%Language:Makefile 0.6%