# 着手开发一个docker
# 介绍
手写docker,最近在学习如何手写docker,参考的是B站中的《造轮子系列-手写docker》,原版视频地址 代码不是我原创,我在《造轮子系列-手写docker》基础之上,做了一些改进,主要是方便大家学习和调试代码。mydocker是一个循序渐进的教程,方便大家从零开始学习云原生开发。
1、首先是在windows环境中,使用vscode来远程开发和调试mydocker;
2、在ubuntu服务器中,安装go语言环境,然后使用开源的dlv工具来远程调试代码;
3、使用makefile编译代码。
# MyDocker可以干什么
1、系统的学习云原生的工作原理
2、系统的学习go语言,提升go语言编程能力
3、可以帮助你成为一名云原生开发工程师
4、开发自己的容器云和k8s
5、成为一个厉害的程序员...
# 版本说明
mydocker0.1 实现创建一个新的命名空间
mydocker0.2 实现创建一个新的命名空间和进程隔离
mydocker0.3 实现挂载到proc进程中,容器里面只一个进程
mydocker0.4 实现进程间隔离、命名空间隔离和文件系统隔离,docker外面的shell命令不能使用的问题
# 软件架构
#go语言建议版本
go 1.20.0
#dlv go语言调试器版本
dlv 1.20.0
#操作系统
ubuntu24 linux
#linux下的Makefile编辑工具
makefile
# 编译教程
1. 安装ubuntu
在虚拟机中安装ubuntu24,一般建议安装最近版本。
2. 安装go语言开发环境
建议安装go 1.20.0,也可以按自己的环境来安装,但是要修改go.mod中的版本号
3. 安装dlv调试工具
在ubuntu中安装dlv调式工具,国内可以使用gitee中的源代码来安装
4. 安装vscode
在windows中安装vscode,并安装go语言插件
5. 安装ssh远程插件
要在vscode中远程调试ubuntu中的go语言,需要在vscode中安装Remote SSH,并登录到ubuntu中
以上的安装步骤网上有很多写的不错的教程,大家自行查找,本项目就不在一一介绍了
# 远程调试
在launch.json配置远程服务器并登录,如下图

调试代码 首先启动startDebugger.sh调试命令

运行调试

# MyDocker0.4版本
mydocker0.4实现了进程间隔离、命名空间隔离和文件系统隔离,docker外面的shell命令不能使用的问题,故编译步骤比较复杂,本章特别说明
# 创建隔离用的文件系统
创建rootfs目录,命令如下:
mkdir rootfs
创建bin/lib目录,lib下的目录要根据你自己的系统目录来创建,使用ldd查看具体的目录信息
#查看bash命令有哪些动态链接库
ldd /bin/bash
#查看ps命令有哪些动态链接库
ldd /bin/ps
#进入rootfs目录
cd rootfs
#创建bin目录
mkdir bin
#创建lib目录
mkdir lib
#创建lib64目录
mkdir lib64
接下来创建lib下面的子目录,例如我的动态连接库目录是lib/x86_64-linux-gnu,则创建下列目录
mkdir lib/x86_64-linux-gnu
创建proc目录
mkdir proc
复制bash命令
#复制bash命令
cp /bin/bash rootfs/bin
#复制bash命令的动态链接库,这个命令不全,请大家自己查看一下自己的机器的动态链接库,并复制
cp /lib/x86_64-linux-gnu/libtinfo.so.6 rootfs/lib/x86_64-linux-gnu/
复制ps命令相关库
#复制ps命令
cp /bin/ps rootfs/bin
#复制ps命令关联的动态链接库
cp /lib/x86_64-linux-gnu/libproc2.so.0 /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libsystemd.so.0 /lib/x86_64-linux-gnu/libcap.so.2 /lib/x86_64-linux-gnu/libgcrypt.so.20 /lib/x86_64-linux-gnu/liblz4.so.1 /lib/x86_64-linux-gnu/liblzma.so.5 /lib/x86_64-linux-gnu/libzstd.so.1 /lib/x86_64-linux-gnu/libgpg-error.so.0 rootfs/lib/x86_64-linux-gnu/
cp /lib64/ld-linux-x86-64.so.2 rootfs/lib64/
# 运行mydocker
运行mydocker
#运行mydocker
mydocker run /bin/bash
#查看进程
ps aux
出现如下效果证明编译成功

# 参与贡献
- Fork 本仓库
- 新建 Feat_xxx 分支
- 提交代码
- 新建 Pull Request
# 开发MyDocker的初衷
mydocker项目最早起源于我在实际工作中的一个需求,需要为客户的一个产品编写自动上云(k8s operator)的插件,当时虽然对k8s有一定的了解,也能使用k8s部署应用程序,但是对于k8s operator的开发是一窍不通,通过一段时间的学习,逐渐掌握了k8s的插件开发能力,由此对K8S和docker产生了浓厚的兴趣,于是决定着手来开发mydocker,主要目的是为了掌握go语言的核心语法和docker的底层原理,希望本项目也能帮助到更多的同学彻底掌握go语言的开发能力,掌握云原生项目开发。