Skip to content

OrangeDou/DockerGo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DockerGo

使用 go 手写 docker(Linux 才能跑!Linux 才能跑!Linux 才能跑!)不是跨平台不想做,go 实现跨平台还是不如 c,太多系统调用无法实现了。

Introduce

主要介绍从 0 实现 docker 需要掌握的必备知识,帮助阅读代码中的注释。代码参考书籍《自己动手写 docker》,开发基于 Ubuntu。

Linux proc 文件系统

Steps

1.实现 Run 命令

docker run -ti [cmmand] (需在 linux 系统运行,并已执行 mount -t proc proc /proc)

2.增加容器资源限制

包括对容器的内存限制、CPU 时间片权重、CPU 核心数进行限制,主要实现了以下命令:
docker run -ti -m 100m -cpuset 1 -cpushare 512 /bin/sh
将每个容器作为一个 subsystem,包含四个接口,实现 subsystem 的 Cgroup 资源限制,

在/sys/fs/cgroup/memory 中创建文件夹对应创建的 cgroup,就可以做内存限制。(实际上是在创建一个新的 cgroup,这个 cgroup 可以用来限制和监控一组进程的内存使用),创建 cgroup 后,就可以将进程添加到这个 cgroup 中,通常通过写入 cgroup.procs 文件来实现。一旦进程被添加到 cgroup,它将受到该 cgroup 设置的内存限制。该部分是通过将容器进程移动到 subsystem 创建的 cgroup 中进行资源限制。

3.增加进程间通信的管道机制

从本质上说,管道是文件的一种,它和文件通信的区别在于,管道内有一个固定大小的缓冲区,一般是4k,会阻塞IO。gocker使用管道进行父子进程之间的参数传递。

4.让 container 跑在 image 中