bocker完整命令参考:pull/run/exec/commit等10大命令与docker逐一对照
【免费下载链接】bockerDocker implemented in around 100 lines of bash项目地址: https://gitcode.com/gh_mirrors/bo/bocker
bocker 是一个用约 100 行 bash 脚本实现的极简版 Docker,让你用最少的代码理解容器镜像、容器、网络命名空间与 cgroups 的全部核心原理。本文给出 bocker 完整命令参考,把 pull、run、exec、commit 等 10 大命令与 docker 逐一对照,帮你快速上手这个"透明 Docker"。
为什么值得学:100行bash实现的极简Docker
bocker 的核心脚本只有一个文件 bocker,全部功能(pull、init、images、ps、run、exec、logs、commit、rm、help)都写在这一份约 100 行的 bash 里。没有守护进程、没有复杂 RPC,每条命令都是直接的 shell 操作:
- 镜像/容器:btrfs 子卷(subvolume),
img_*是镜像,ps_*是容器快照 - 隔离:
unshare+ip netns+chroot组合完成 - 资源限制:
cgcreate/cgset/cgexec操作 cgroups
⚠️ bocker 以 root 运行,会修改网卡、路由表和防火墙规则。官方强烈建议在虚拟机里运行,仓库自带的 Vagrantfile 可一键搭建所需环境。
前置准备:运行 bocker 的环境要求
开始对照命令之前,需要确认系统满足 README.md 中的要求:
| 依赖 | 用途 |
|---|---|
| btrfs-progs | 镜像/容器的存储基础 |
| iproute2 | 创建 veth 网卡与网络命名空间 |
| iptables | 防火墙与流量转发 |
| libcgroup-tools | 资源配额(cpu.shares、memory.limit) |
| util-linux ≥ 2.25.2 | unshare、nsenter 等工具 |
此外还需:/var/bocker挂载 btrfs 文件系统、名为bridge0的网桥(IP 10.0.0.1/24)、开启 IP 转发。
10大命令速查表:bocker 与 docker 一一对照
| # | bocker 命令 | docker 对应命令 | 作用 |
|---|---|---|---|
| 1 | bocker pull <name> <tag> | docker pull | 从 Docker Hub 拉取镜像 |
| 2 | bocker init <directory> | docker build(受限版) | 从本地目录构建镜像 |
| 3 | bocker images | docker images | 列出所有镜像 |
| 4 | bocker ps | docker ps -a | 列出所有容器 |
| 5 | bocker run <img> <cmd> | docker run | 从镜像创建并运行容器 |
| 6 | bocker exec <ps> <cmd> | docker exec | 在运行中容器里执行命令 |
| 7 | bocker logs <ps> | docker logs | 查看容器日志 |
| 8 | bocker commit <ps> <img> | docker commit | 把容器固化成新镜像 |
| 9 | bocker rm <id> | docker rm/docker rmi | 删除容器或镜像 |
| 10 | bocker help | docker --help | 查看命令帮助 |
一个记忆要点:bocker 里镜像 id 以img_开头,容器 id 以ps_开头,与 docker 的十六进制短 id 不同。
拉取镜像:bocker pull 对照 docker pull
对照docker pull,bocker 的 pull 实现见 bocker:
bocker pull centos 7 # Created: img_42150它的原理非常直白:向index.docker.io申请 token → 查询镜像层列表(ancestry)→ 逐层curl下载 tar 包并解压到临时目录 → 调用bocker_init生成 btrfs 子卷。测试脚本 tests/test_pull 分别拉取centos:7和ubuntu:14.04并验证了版本输出。
与docker pull的差异:
- 只支持Docker Hub,不支持私有 registry
- 拉取过程是逐层
curl下载(带进度条),而非 docker 的分块流式加载 - 不支持
latest之外的复杂 tag 语法之外的功能(没有 digest 拉取)
本地构建:bocker init 对照 docker build
docker build解析 Dockerfile 逐层执行;bocker 的替代方案init更原始——直接把一个已准备好的根文件系统目录复制成镜像:
bocker init ~/base-image # Created: img_42087实现见 bocker:创建img_*btrfs 子卷,cp --reflink=auto拷贝目录内容(btrfs 上是瞬间完成的 CoW 引用),并记录来源路径。它对应的是"我手上已经有一个系统根目录,帮我打包成镜像"的场景,而非完整的 Dockerfile 构建流程。
查看资产:bocker images 与 bocker ps
两条只读命令,输出风格朴素但信息完整:
bocker images # IMAGE_ID SOURCE # img_42150 centos:7 bocker ps # CONTAINER_ID COMMAND # ps_42045 cat /etc/centos-releaseimages遍历/var/bocker下的img_*子卷,读取其中保存的img.source文件显示来源(bocker)ps遍历ps_*子卷,显示容器执行过的命令(bocker)
注意bocker ps显示的是全部历史容器(含已退出的),更接近docker ps -a而非docker ps——容器在 bocker 里没有"退出即消失"的状态,快照一直留着,直到你rm它。
运行容器:bocker run 对照 docker run
run是 bocker 最复杂的命令(bocker),一条命令里能看到一个容器诞生的全过程:
- 生成
ps_*容器 id,用它的末 3 位推导容器 IP 与 MAC 地址 ip link add创建 veth 网卡对,一端挂到bridge0ip netns add创建网络命名空间,配置 lo、IP、默认路由btrfs subvolume snapshot把镜像子卷秒级快照成容器子卷cgcreate+cgset设置 cpu.shares 与内存上限cgexec + ip netns exec + unshare + chroot启动命令,输出同时tee到容器日志文件
bocker run img_42150 cat /etc/centos-release # CentOS Linux release 7.1.1503 (Core)与docker run的差异点:
| 特性 | bocker run | docker run |
|---|---|---|
| 资源限制 | 环境变量BOCKER_CPU_SHARE/BOCKER_MEM_LIMIT | --cpus/--memory参数 |
| 后台运行 | 不支持-d,前台阻塞执行 | 支持 |
| 端口映射 | 不支持(尚未实现) | -p |
| 数据卷 | 不支持(尚未实现) | -v/--mount |
run命令会阻塞到命令执行完,这也是为什么测试脚本 tests/test_exec 需要用sleep 5后台占位,才能模拟"容器仍在运行"来测试 exec。
进入容器:bocker exec 对照 docker exec
bocker exec ps_42045 ps aux实现(bocker)两步走:先通过ps输出找到容器进程树里的unshare进程 pid,再用nsenter -t <pid> -m -u -i -n -p进入它的 mount/uts/ipc/net/pid 命名空间并chroot执行命令。两个典型报错:
- 容器不存在 →
No container named 'ps_xxx' exists - 容器已退出 →
Container 'ps_xxx' exists but is not running
与docker exec -it不同,bocker exec不支持交互式 TTY 分配(没有-it参数),适合执行一次性命令。
查看日志:bocker logs 对照 docker logs
最简单的一条:bocker logs <container_id>直接cat容器的.log文件(bocker)。因为run时输出已用tee落盘到子卷内的ps_xxx.log,所以即使容器进程已结束,日志也完整可读——这是 tests/test_run 中每个用例都采用"run → ps 取 id → logs 断言 → rm"模式的原因。
对应关系上它相当于docker logs,但没有-f跟踪、没有按容器过滤的多路复用。
固化镜像:bocker commit 对照 docker commit
在容器里装好软件后,用commit把改动固化进镜像(bocker):
bocker run img_42150 yum install -y wget # 容器内装 wget bocker commit ps_42018 img_42150 # Removed: img_42150 / Created: img_42150 bocker run img_42150 which wget # /usr/bin/wget注意 commit 的签名:bocker commit <container_id> <image_id>,目标 image_id 必须已存在——它的实现是先删旧镜像子卷,再把容器子卷快照回同一 image_id。这与docker commit"生成新 id"的语义不同:bocker 更像"覆盖式更新同名镜像"。tests/test_commit 完整演示了"装软件 → commit → 新容器验证"的闭环。
由于底层是 btrfs 快照,commit 是 O(1) 的 CoW 操作,无论镜像多大都瞬间完成——这也是整个项目"100 行实现 Docker"的核心巧思之一。
删除资源:bocker rm 对照 docker rm / docker rmi
bocker rm ps_42045 # 删容器 bocker rm img_42150 # 删镜像rm同时覆盖docker rm和docker rmi两种角色(bocker):判断img_*还是ps_*,删除 btrfs 子卷;如果是容器,顺带cgdelete清理 cgroup。没有-f强制删除的概念——bocker 的容器没有"运行中/已退出"互斥状态,随时可删。
仓库的清理脚本 tests/teardown 就是先images再ps遍历rm的示例写法。
查看帮助:bocker help 对照 docker --help
bocker help # 或直接运行 bocker(不带参数)帮助文本并不是独立文件——每个函数定义后紧跟#HELP注释,bocker_help用sed实时从 bocker 脚本自身提取,做到了"源码即文档"的零维护成本。
尚未实现的功能:bocker 与 docker 的边界
对照docker,README.md 明确了 bocker 尚未实现的能力:
- ❌ 数据卷容器(Data Volume Containers)
- ❌ 数据卷(Data Volumes)
- ❌ 端口转发(Port Forwarding)
也就是说 bocker 定位于理解容器原理 + 轻量隔离运行,不追求生产级功能。若你的目标是学习"容器到底是什么",它提供的是一条比任何文档都短的代码路径:pull → run → exec → commit → rm全链路,每一环都摊开在 bocker 的 100 行里。
总结:一张表带走 bocker 命令对照
| 场景 | 你平时敲的 | 换成 bocker |
|---|---|---|
| 拉镜像 | docker pull | bocker pull |
| 建镜像 | docker build | bocker init(目录打包) |
| 看镜像 | docker images | bocker images |
| 看容器 | docker ps -a | bocker ps |
| 跑容器 | docker run | bocker run |
| 进容器 | docker exec | bocker exec |
| 看日志 | docker logs | bocker logs |
| 存镜像 | docker commit | bocker commit |
| 删资源 | docker rm/rmi | bocker rm(二合一) |
| 查帮助 | docker --help | bocker help |
想动手验证的读者,可以直接运行仓库根目录的 test 脚本,它会自动执行 tests/ 下全部用例并打印 PASSED/FAILED,是理解每条命令行为的最快方式。
【免费下载链接】bockerDocker implemented in around 100 lines of bash项目地址: https://gitcode.com/gh_mirrors/bo/bocker
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考