100行bash重写Docker?!bocker终极揭秘:极简容器引擎如何颠覆你的认知
2026/9/19 2:42:54 网站建设 项目流程

100行bash重写Docker?!bocker终极揭秘:极简容器引擎如何颠覆你的认知

【免费下载链接】bockerDocker implemented in around 100 lines of bash项目地址: https://gitcode.com/gh_mirrors/bo/bocker

你有没有想过,一个功能对标 Docker 的容器引擎,竟然只需要约 100 行 bash 就能实现?bocker 就是这样一个极简容器引擎——用单一 bash 脚本完成了镜像拉取、容器运行、exec 执行、commit 提交等 Docker 核心能力。本文带你快速完成 bocker 环境搭建、掌握全部命令用法,并揭秘它背后的底层原理,颠覆你对容器技术的复杂度认知。

🐳 什么是 bocker:100 行 bash 写成的轻量级 Docker 替代方案

bocker 是 2015 年由 Peter Wilmott 开发的极简容器引擎,遵循 GPL-3.0 协议(见 LICENSE)。它没有守护进程、没有复杂 API,整个"引擎"就是这样一个 bash 脚本:bocker。

核心思路一句话概括:

btrfs 子卷做镜像存储 + network namespace 做网络隔离 + unshare/chroot 做进程隔离 + cgroups 做资源配额

这正是所有 Linux 容器(包括 Docker)的底层本质——bocker 只是把这套机制用最直观的方式"裸奔"给你看。

📋 bocker 功能清单:它已经实现了什么?

对照 README(README.md)中的功能列表,bocker 与 Docker 命令几乎一一对应:

bocker 命令对应 Docker 命令说明
bocker pulldocker pull从 Docker Hub 拉取镜像
bocker initdocker build从本地目录创建镜像
bocker rundocker run创建并运行容器
bocker execdocker exec进入运行中的容器执行命令
bocker ps/imagesdocker ps/images查看容器与镜像
bocker logsdocker logs查看容器日志
bocker commitdocker commit将容器提交为新镜像
bocker rmdocker rm/rmi删除容器或镜像

此外还内置了网络支持(veth + bridge)与资源配额(cgroups:CPU shares 与内存上限)。

bocker init仅提供docker build的极简实现。未实现的功能:数据卷容器、数据卷、端口转发。

⚡ 一键安装步骤:5 分钟搭建 bocker 运行环境

bocker 对系统有硬性依赖,这也是它"极简"的代价。

1️⃣ 依赖软件包

  • btrfs-progscurliproute2iptableslibcgroup-tools
  • util-linux ≥ 2.25.2(发行版自带的版本通常太旧,需要源码编译)

2️⃣ 系统配置四件套

  • /var/bocker挂载一块btrfs 文件系统(镜像与容器的存储基石)
  • 创建名为bridge0的网络桥,IP 为10.0.0.1/24
  • 开启 IP 转发:/proc/sys/net/ipv4/ip_forward置 1
  • 防火墙将bridge0的流量路由到物理网卡

3️⃣ 最快配置方法:用 Vagrantfile 自动化

手动配置太麻烦?项目附带了一份 Vagrantfile,一条命令即可在 CentOS 7 虚拟机中完成全部环境搭建:编译 util-linux、挂载 btrfs 镜像、配置 iptables 与 bridge0,并生成用于bocker init的基础镜像。

⚠️重要提醒:bocker 以 root 运行,会修改网络接口、路由表和防火墙规则。官方强烈建议只在虚拟机中运行,"无法保证它不会搞坏你的系统"(README.md)。

🚀 bocker 命令速查:从 pull 到 run 跑通容器全流程

环境就绪后,完整生命周期只需这几步(示例摘自 README.md):

拉取镜像并查看

bocker pull centos 7 bocker images # 输出: img_42150 centos:7

运行容器并查看结果

bocker run img_42150 cat /etc/centos-release bocker ps # 列出容器及命令 bocker logs ps_42045 # 查看输出日志

进入容器、提交镜像

bocker run img_42150 yum install -y wget # 容器内装软件 bocker commit ps_42018 img_42150 # 把变更提交为新镜像 bocker run img_42150 which wget # 验证: /usr/bin/wget

资源配额:通过环境变量BOCKER_CPU_SHARE(默认 512)与BOCKER_MEM_LIMIT(默认 512 MB)控制单个容器的 CPU 份额与内存上限。

清理

bocker rm ps_42045 # 删除容器或镜像

🔍 终极原理揭秘:bash + btrfs 如何造出容器?

打开 bocker 主脚本,每个功能都只是一个 bash 函数。最有价值的三处实现:

🧊 镜像 = btrfs 子卷bocker init把目录cp --reflink=auto拷入一个新子卷;bocker commit则只做一件事——btrfs subvolume snapshot秒级完成、几乎零额外空间,这就是写时复制(CoW)的威力。

🌐 网络隔离 = veth 对 + network namespacebocker run中连续数行ip命令:创建 veth 网卡对,一端挂到bridge0,另一端塞进新建的网络命名空间,再配上 IP、MAC 与默认路由——容器即刻拥有独立 IP(10.0.0.x),还能 ping 通外网。

🚀 容器启动 = unshare + chroot + cgroup

cgexec -g "cpu,cpuacct,memory:$uuid" \ ip netns exec netns_$uuid \ unshare -fmuip --mount-proc \ chroot /var/bocker/$uuid \ /bin/sh -c "/bin/mount -t proc proc /proc && $cmd"

资源限制(cgcreate/cgset)、文件系统隔离(chroot)、内核资源隔离(unshare)三合一,这就是"容器"的全部真相。

🔁 exec 的巧思bocker exec不维护任何状态,而是通过ps命令反查 unshare 进程,再用nsenter直接"钻进"容器的命名空间执行命令——零额外架构。

🧪 如何运行 bocker 测试:一键验证全部功能

项目内置完整测试套件,由入口脚本 test 依次执行 tests/ 目录下的用例,每个用例前后自动清理环境:

  • tests/test_pull:分别拉取 centos 7 与 ubuntu 14.04 镜像并验证
  • tests/test_run:验证 echo、uname、网络(ping 8.8.8.8 / google.com)
  • tests/test_exec:验证进入运行中容器,以及容器已停止时的报错
  • tests/test_commit:容器内安装 wget → commit → 新镜像中可见

在虚拟机中执行./test,绿色 PASSED 即代表所有功能正常。

🎯 bocker 适合谁?一个学习容器原理的最佳载体

bocker 并不是为了"取代 Docker"而生的——它没有端口转发、没有数据卷、没有守护进程。但正因如此,它是理解容器本质的最佳教具:

  • 新手入门:不到 100 行代码,逐函数读完即可彻底搞懂 namespaces、cgroups 与 btrfs CoW
  • 运维学习者:亲手配置 bridge、iptables 与 IP 转发,比任何文档都深刻
  • 极客玩具:体验"最小可运行容器"的纯粹乐趣

当你下次再运行docker run时,你会清楚地知道:那 100 行 bash 所做的事,正是 Docker 每天替你做的事。

【免费下载链接】bockerDocker implemented in around 100 lines of bash项目地址: https://gitcode.com/gh_mirrors/bo/bocker

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询