# 着手开发一个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中

以上的安装步骤网上有很多写的不错的教程,大家自行查找,本项目就不在一一介绍了

# 远程调试

  1. 在launch.json配置远程服务器并登录,如下图 输入图片说明

  2. 调试代码 首先启动startDebugger.sh调试命令 输入图片说明

  3. 运行调试 输入图片说明

# 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

出现如下效果证明编译成功

输入图片说明

# 参与贡献

  1. Fork 本仓库
  2. 新建 Feat_xxx 分支
  3. 提交代码
  4. 新建 Pull Request

# 开发MyDocker的初衷

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

Last Updated: 11/23/2024, 3:10:29 PM