使用 Rust 来实现自己的 Docker

背景

最近刚刚学完 Rust 的语法,所以想做一个简单的《Build your own docker》,看到 CodeCrafters 有个的教程,所以赶紧来试一下。

开搞

项目搭建

教程中的项目有提供最基础的项目代码,在编写完成后提交代码会在云端进行测试验证,但是我想在本地直接进行验证(其实是后面的章节收费了,大雾),所以项目由以下两部分组成:
docker:完整的 my-docker 项目源码,执行 your_docker.sh 的时候会通过 cargo run 来执行代码
notion image
tester:本地测试命令的项目,这部分代码在《docker-tester》,不过这部分是用 go 写的,所以要运行在 docker 项目里
notion image
项目根目录会提供两个脚本方便测试
  • test_your_docker.sh:在 docker 中执行 docker-tester 来验证 cli 的逻辑
    • test_shell_output.sh:判断命令输出是否符合要求
    如果想直接运行 mydocker,可以直接添加以下 alias

    功能实现

    1. 命令执行并输出

    根据用户传入的命令,在本地电脑执行对应的命令,并且处理好对应的输入输出和退出逻辑,关键代码如下

    2. 处理 exit 逻辑

    在执行命令之后判断命令是否执行成功,如果没有则返回相应的退出码

    3. 文件系统隔离

    文件系统是借用的宿主的 chroot 能力,该能力可以改变当前进程及其子进程根目录的操作,从而完成文件系统的隔离

    4. 进程隔离

    通过使用 PID namespaces 的方式来常见一个新的进程 ID 命名空间,来进行进程隔离

    5. 其他

    到此为止已对项目中的核心功能进行了复现,其他的部分以后再来探索吧:
    • 登录到 docker hub
      • 下载 docker 镜像
        • 运行镜像时使用 docker layer

          总结

          总的来说还是很有意思的,在熟悉了 rust 的同时也了解了 Linux 的 chrootPID namespace 的能力,并且对 docker 的基本运行原理有了更深一步的了解,Very nice!

          Reference


          © Jiyu Shao 2018 - 2025