Giter Club home page Giter Club logo

mydocker's Introduction

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命令,实现对不同容器打包.

第十五篇:

容器网络

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

前置:揭秘 Docker 网络:手动实现 Docker 桥接网络

第十七篇:

第十八篇:

第十九篇:


最后打个广告,扫描下面二维码,关注我即时获取更多文章~

mydocker's People

Contributors

lixd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

mydocker's Issues

关于第16讲

network/ipam.go

1

// size - one是子网掩码后面的网络位数,2^(size - one)表示网段中的可用IP数
// 而2^(size - one)等价于1 << uint8(size - one)
(*ipam.Subnets)[subnet.String()] = strings.Repeat("0", 1<<uint8(size-one))

此处可用ip数是否需要变更为

(*ipam.Subnets)[subnet.String()] = strings.Repeat("0", 1<<(size-one)-2)

自动扣除网关和广播地址

2

for t := uint(4); t > 0; t -= 1 {
[]byte(ip)[4-t] += uint8(c >> ((t - 1) * 8))
}
// /由于此处IP是从1开始分配的(0被网关占了),所以最后再加1,最终得到分配的IP 172.17.0.20
ip[3] += 1

此处代码是否要修改为

cnt := c + 1
for t := uint(4); t > 0; t-- {
ip[4-t] += uint8(cnt >> ((t - 1) * 8))
}

不应该直接在ip[3]处+1,如果计算出的ip[3]为255,+1的话ip[3]会变为0
例:172.16.0.0/12 数组序号为255

package main

import (
	"fmt"
	"net"
)

func main() {
	_, subnet, _ := net.ParseCIDR("172.16.0.0/12")
	ip := subnet.IP
	c := 255
	fmt.Println(ip)
	for t := uint(4); t > 0; t-- {
		[]byte(ip)[4-t] += uint8(c >> ((t - 1) * 8))
	}
	ip[3]++
	fmt.Println(ip)
}

输出为

172.16.0.0
172.16.0.0

修改后

package main

import (
	"fmt"
	"net"
)

func main() {
	_, subnet, _ := net.ParseCIDR("172.16.0.0/12")
	ip := subnet.IP
	c := 255
	c++
	fmt.Println(ip)
	for t := uint(4); t > 0; t-- {
		[]byte(ip)[4-t] += uint8(c >> ((t - 1) * 8))
	}
	fmt.Println(ip)
}

输出为

172.16.0.0
172.16.1.0

关于第十二课 mydocker stop

请问一下第十二课中
// 2.发送SIGTERM信号 if err = syscall.Kill(pidInt, syscall.SIGTERM); err != nil { log.Errorf("Stop container %s error %v", containerId, err) return }
syscall.SIGTERM换成syscall.SIGTERM是否更合适一点呢

为什么出现 untar error

报错如下:

./mydocker run -it  /bin/ls
{"level":"info","msg":"createTty true","time":"2024-06-17T12:17:03+08:00"}
{"level":"info","msg":"resConf:\u0026{ 0  }","time":"2024-06-17T12:17:03+08:00"}
{"level":"info","msg":"lower:/var/lib/mydocker/overlay2/3090112964/lower image.tar:/var/lib/mydocker/image//bin/ls.tar","time":"2024-06-17T12:17:03+08:00"}
{"level":"error","msg":"Untar dir /var/lib/mydocker/overlay2/3090112964/lower error exit status 2","time":"2024-06-17T12:17:03+08:00"}
{"level":"info","msg":"mount overlayfs: [/bin/mount -t overlay overlay -o lowerdir=/var/lib/mydocker/overlay2/3090112964/lower,upperdir=/var/lib/mydocker/overlay2/3090112964/upper,workdir=/var/lib/mydocker/overlay2/3090112964/work /var/lib/mydocker/overlay2/3090112964/merged]","time":"2024-06-17T12:17:03+08:00"}
{"level":"info","msg":"command all is ","time":"2024-06-17T12:17:03+08:00"}
{"level":"info","msg":"init come on","time":"2024-06-17T12:17:03+08:00"}
{"level":"info","msg":"Current location is /var/lib/mydocker/overlay2/3090112964/merged","time":"2024-06-17T12:17:03+08:00"}
{"level":"error","msg":"Exec loop path error exec: \"\": executable file not found in $PATH","time":"2024-06-17T12:17:03+08:00"}
{"level":"fatal","msg":"exec: \"\": executable file not found in $PATH","time":"2024-06-17T12:17:03+08:00"}
{"level":"info","msg":"umountOverlayFS,cmd:/bin/umount /var/lib/mydocker/overlay2/3090112964/merged","time":"2024-06-17T12:17:03+08:00"}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.