{"id":41066337,"url":"https://github.com/lixd/mydocker","last_synced_at":"2026-01-22T12:39:28.620Z","repository":{"id":59807617,"uuid":"443671768","full_name":"lixd/mydocker","owner":"lixd","description":"参考《自己动手写 docker》从零开始实现一个简易的 docker 以及相关教程。Build a simple Docker from scratch along with related tutorials.","archived":false,"fork":false,"pushed_at":"2024-08-25T07:56:48.000Z","size":71,"stargazers_count":433,"open_issues_count":0,"forks_count":47,"subscribers_count":5,"default_branch":"feat-cgroup-v2","last_synced_at":"2025-05-25T12:02:48.614Z","etag":null,"topics":["container","docker","go","golang","lxc"],"latest_commit_sha":null,"homepage":"https://www.lixueduan.com/categories/docker/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lixd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-02T03:18:24.000Z","updated_at":"2025-05-23T07:32:29.000Z","dependencies_parsed_at":"2024-03-02T11:28:39.282Z","dependency_job_id":"f6905514-2be8-43ca-9f1c-3658e7a7167c","html_url":"https://github.com/lixd/mydocker","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lixd/mydocker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lixd%2Fmydocker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lixd%2Fmydocker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lixd%2Fmydocker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lixd%2Fmydocker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lixd","download_url":"https://codeload.github.com/lixd/mydocker/tar.gz/refs/heads/feat-cgroup-v2","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lixd%2Fmydocker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28662964,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["container","docker","go","golang","lxc"],"created_at":"2026-01-22T12:39:27.951Z","updated_at":"2026-01-22T12:39:28.615Z","avatar_url":"https://github.com/lixd.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mydocker\n\n## 1. 概述\n\n参考[《自己动手写 docker》](https://github.com/xianlubird/mydocker),自己动手从零开始实现一个简易的 docker 以及配套教程。\n\u003e 再次感谢几位作者大佬\n\n具体差异如下：\n\n* UnionFS替换：从AUFS 替换为 Overlayfs\n* 依赖管理更新：从 go vendor 替换为 Go Module\n* 一些写法上的优化调整\n\n\n### 微信公众号：探索云原生\n\n\u003e 鸽了很久之后，终于开通了，欢迎关注。\n\n一个云原生打工人的探索之路，专注云原生，Go，坚持分享最佳实践、经验干货。\n\n`从零开始写 Docker` 系列持续更新中，扫描下面二维码，关注我即时获取更新~\n\n![](https://img.lixueduan.com/about/wechat/qrcode_search.png)\n\n\n\n### 个人博客：指月小筑(探索云原生)\n在线阅读：[指月小筑(探索云原生)](https://www.lixueduan.com/categories/docker/)\n\n\n## 2. 基础知识\n\n推荐阅读以下文章对 Docker 核心原理有一个大致认识：\n* **核心原理**：[深入理解 Docker 核心原理：Namespace、Cgroups 和 Rootfs](https://www.lixueduan.com/posts/docker/03-container-core/)\n* **基于 namespace 的视图隔离**：[探索 Linux Namespace：Docker 隔离的神奇背后](https://www.lixueduan.com/posts/docker/05-namespace/)\n* **基于 cgroups 的资源限制**\n    * [初探 Linux Cgroups：资源控制的奇妙世界](https://www.lixueduan.com/posts/docker/06-cgroups-1/)\n    * [深入剖析 Linux Cgroups 子系统：资源精细管理](https://www.lixueduan.com/posts/docker/07-cgroups-2/)\n    * [Docker 与 Linux Cgroups：资源隔离的魔法之旅](https://www.lixueduan.com/posts/docker/08-cgroups-3/)\n* **基于 overlayfs 的文件系统**：[Docker 魔法解密：探索 UnionFS 与 OverlayFS](https://www.lixueduan.com/posts/docker/09-ufs-overlayfs/)\n* **基于 veth pair、bridge、iptables 等等技术的 Docker 网络**：[揭秘 Docker 网络：手动实现 Docker 桥接网络](https://www.lixueduan.com/posts/docker/10-bridge-network/)\n\n通过上述文章，大家对 Docker 的实现原理已经有了初步的认知，接下来我们就用 Golang 手动实现一下自己的 docker(mydocker)。\n\n\n## 3. 具体实现\n\n### 构造容器\n\n本章构造了一个简单的容器，具有基本的 Namespace 隔离，确定了基本的开发架构，后续在此基础上继续完善即可。\n\n第一篇：\n* [从零开始写 Docker：实现 run 命令](https://www.lixueduan.com/posts/docker/mydocker/01-mydocker-run/)\n* 代码分支 [feat-run](https://github.com/lixd/mydocker/tree/feat-run)\n\n第二篇：\n* [从零开始写 Docker(二)---优化：使用匿名管道传参](https://www.lixueduan.com/posts/docker/mydocker/02-passing-param-by-pipe/)\n* 代码分支 [opt-passing-param-by-pipe](https://github.com/lixd/mydocker/tree/opt-passing-param-by-pipe)\n\n第三篇：\n* [从零开始写 Docker(三)---基于 cgroups 实现资源限制](https://www.lixueduan.com/posts/docker/mydocker/03-resource-limit-by-cgroups/)\n* 代码分支 [feat-cgroup](https://github.com/lixd/mydocker/tree/feat-cgroup)\n\n\n\n\n\n### 构造镜像\n\n本章首先使用 busybox 作为基础镜像创建了一个容器，理解了什么是 rootfs，以及如何使用 rootfs 来打造容器的基本运行环境。\n\n然后，使用 OverlayFS 来构建了一个拥有二层模式的镜像，对于最上层可写层的修改不会影响到基础层。这里就基本解释了镜像分层存储的原理。\n\n之后使用 -v 参数做了一个 volume 挂载的例子，介绍了如何将容器外部的文件系统挂载到容器中，并且让它可以访问。\n\n最后实现了一个简单版本的容器镜像打包。\n\n这一章主要针对镜像的存储及文件系统做了基本的原理性介绍，通过这几个例子，可以很好地理解镜像是如何构建的，第 5 章会基于这些基础做更多的扩展。\n\n第四篇：\n\n* [从零开始写 Docker(四)---使用 pivotRoot 切换 rootfs 实现文件系统隔离](https://www.lixueduan.com/posts/docker/mydocker/04-change-rootfs-by-pivot-root/)\n* 代码分支 [feat-rootfs](https://github.com/lixd/mydocker/tree/feat-rootfs)\n\n第五篇：\n\n* [从零开始写 Docker(五)---基于 overlayfs 实现写操作隔离](https://www.lixueduan.com/posts/docker/mydocker/05-isolate-operate-by-overlayfs/)\n* 代码分支 [feat-overlayfs](https://github.com/lixd/mydocker/tree/feat-overlayfs)\n\n第六篇：\n\n* [从零开始写 Docker(六)---实现 mydocker run -v 支持数据卷挂载](https://www.lixueduan.com/posts/docker/mydocker/06-volume-by-bind-mount/)\n* 代码分支 [feat-volume](https://github.com/lixd/mydocker/tree/feat-volume)\n\n第七篇：\n\n* [从零开始写 Docker(七)---实现 mydocker commit 打包容器成镜像](https://www.lixueduan.com/posts/docker/mydocker/07-mydocker-commit/)\n* 代码分支 [feat-commit](https://github.com/lixd/mydocker/tree/feat-commit)\n\n\n### 构建容器进阶\n\n本章实现了容器操作的基本功能。\n\n* 首先实现了容器的后台运行，然后将容器的状态在文件系统上做了存储。\n* 通过这些存储信息，又可以实现列出当前容器信息的功能。\n* 并且， 基于后台运行的容器，我们可以去手动停止容器，并清除掉容器的存储信息。\n* 最后修改了上一章镜像的存储结构，使得多个容器可以并存，且存储的内容互不干扰。\n\n第八篇：\n\n* [从零开始写 Docker(八)---实现 mydocker run -d 支持后台运行容器](https://www.lixueduan.com/posts/docker/mydocker/08-mydocker-run-d/)\n* 代码分支 [feat-run-d](https://github.com/lixd/mydocker/tree/feat-run-d)\n\n第九篇：\n\n* [从零开始写 Docker(九)---实现 mydocker ps 查看运行中的容器](https://www.lixueduan.com/posts/docker/mydocker/09-mydocker-ps/)\n* 代码分支 [feat-ps](https://github.com/lixd/mydocker/tree/feat-ps)\n\n\n第十篇：\n\n* [从零开始写 Docker(十)---实现 mydocker logs 查看容器日志](https://www.lixueduan.com/posts/docker/mydocker/10-mydocker-logs/)\n* 代码分支 [feat-logs](https://github.com/lixd/mydocker/tree/feat-logs)\n\n\n\n第十一篇：\n\n* [从零开始写 Docker(十一)---实现 mydocker exec 进入容器内部](https://www.lixueduan.com/posts/docker/mydocker/11-mydocker-exec/)\n* 代码分支 [feat-exec](https://github.com/lixd/mydocker/tree/feat-exec)\n\n\n\n第十二篇：\n\n* [从零开始写 Docker(十二)---实现 mydocker stop 停止容器](https://www.lixueduan.com/posts/docker/mydocker/12-mydocker-stop/)\n* 代码分支 [feat-stop](https://github.com/lixd/mydocker/tree/feat-stop)\n\n\n\n第十三篇：\n\n* [从零开始写 Docker(十三)---实现 mydocker rm 删除容器](https://www.lixueduan.com/posts/docker/mydocker/13-mydocker-rm/)\n* 代码分支 [feat-rm](https://github.com/lixd/mydocker/tree/feat-rm)\n\n\n\n第十四篇：\n\n* [从零开始写 Docker(十四)---重构：实现容器间 rootfs 隔离](https://www.lixueduan.com/posts/docker/mydocker/14-isolation-rootfs-between-containers/)\n* 代码分支 [refactor-isolate-rootfs](https://github.com/lixd/mydocker/tree/refactor-isolate-rootfs)\n\u003e refactor: 文件系统重构,为不同容器提供独立的rootfs. feat: 更新rm命令，删除容器时移除对应文件系统. feat: 更新commit命令，实现对不同容器打包.\n\n\n\n第十五篇：\n\n* [从零开始写 Docker(十五)---实现 mydocker run -e 支持环境变量传递](https://www.lixueduan.com/posts/docker/mydocker/15-mydocker-run-e/)\n* 代码分支 [feat-run-e](https://github.com/lixd/mydocker/tree/feat-run-e)\n\n\n### 容器网络\n\n在这一章中，首先手动给一个容器配置了网路，并通过这个过程了解了 Linux 虚拟网络设备和操作。然后构建了容器网络的概念模型和模块调用关系、IP 地址分配方案，以及网络模块的接口设计和实现，并且通过实现 Bridge\n驱动给容器连上了“网线”。\n\n前置：[揭秘 Docker 网络：手动实现 Docker 桥接网络](https://www.lixueduan.com/posts/docker/10-bridge-network/)\n\n* 第十六篇：\n\n* [从零开始写 Docker(十六)---容器网络实现(上)：为容器插上”网线“](https://www.lixueduan.com/posts/docker/mydocker/16-network-1/)\n* 代码分支 [feat-network-1](https://github.com/lixd/mydocker/tree/feat-network1)\n\n第十七篇：\n\n* [从零开始写 Docker(十七)---容器网络实现(中)：为容器插上”网线“](https://www.lixueduan.com/posts/docker/mydocker/16-network-2/)\n* 代码分支 [feat-network-2](https://github.com/lixd/mydocker/tree/feat-network2)\n\n\n第十八篇：\n\n* [从零开始写 Docker(十八)---容器网络实现(下)：为容器插上”网线“](https://www.lixueduan.com/posts/docker/mydocker/16-network-3/)\n* 代码分支 [feat-network-3](https://github.com/lixd/mydocker/tree/feat-network3)\n\n\n第十九篇：\n\n* [从零开始写 Docker(十九)---增加 cgroup v2 支持](https://www.lixueduan.com/posts/docker/mydocker/19-cgroup-v2/)\n* 代码分支 [feat-cgroup-v2](https://github.com/lixd/mydocker/tree/feat-cgroup-v2)\n\n\n---\n最后打个广告，扫描下面二维码，关注我即时获取更多文章~\n\n![](https://img.lixueduan.com/about/wechat/qrcode_search.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flixd%2Fmydocker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flixd%2Fmydocker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flixd%2Fmydocker/lists"}