news 2026/9/19 15:40:25

bocker完整命令参考:pull/run/exec/commit等10大命令与docker逐一对照

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
bocker完整命令参考:pull/run/exec/commit等10大命令与docker逐一对照

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.2unshare、nsenter 等工具

此外还需:/var/bocker挂载 btrfs 文件系统、名为bridge0的网桥(IP 10.0.0.1/24)、开启 IP 转发。

10大命令速查表:bocker 与 docker 一一对照

#bocker 命令docker 对应命令作用
1bocker pull <name> <tag>docker pull从 Docker Hub 拉取镜像
2bocker init <directory>docker build(受限版)从本地目录构建镜像
3bocker imagesdocker images列出所有镜像
4bocker psdocker ps -a列出所有容器
5bocker run <img> <cmd>docker run从镜像创建并运行容器
6bocker exec <ps> <cmd>docker exec在运行中容器里执行命令
7bocker logs <ps>docker logs查看容器日志
8bocker commit <ps> <img>docker commit把容器固化成新镜像
9bocker rm <id>docker rm/docker rmi删除容器或镜像
10bocker helpdocker --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:7ubuntu: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-release
  • images遍历/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),一条命令里能看到一个容器诞生的全过程:

  1. 生成ps_*容器 id,用它的末 3 位推导容器 IP 与 MAC 地址
  2. ip link add创建 veth 网卡对,一端挂到bridge0
  3. ip netns add创建网络命名空间,配置 lo、IP、默认路由
  4. btrfs subvolume snapshot把镜像子卷秒级快照成容器子卷
  5. cgcreate+cgset设置 cpu.shares 与内存上限
  6. 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 rundocker 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 rmdocker rmi两种角色(bocker):判断img_*还是ps_*,删除 btrfs 子卷;如果是容器,顺带cgdelete清理 cgroup。没有-f强制删除的概念——bocker 的容器没有"运行中/已退出"互斥状态,随时可删。

仓库的清理脚本 tests/teardown 就是先imagesps遍历rm的示例写法。

查看帮助:bocker help 对照 docker --help

bocker help # 或直接运行 bocker(不带参数)

帮助文本并不是独立文件——每个函数定义后紧跟#HELP注释,bocker_helpsed实时从 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 pullbocker pull
建镜像docker buildbocker init(目录打包)
看镜像docker imagesbocker images
看容器docker ps -abocker ps
跑容器docker runbocker run
进容器docker execbocker exec
看日志docker logsbocker logs
存镜像docker commitbocker commit
删资源docker rm/rmibocker rm(二合一)
查帮助docker --helpbocker help

想动手验证的读者,可以直接运行仓库根目录的 test 脚本,它会自动执行 tests/ 下全部用例并打印 PASSED/FAILED,是理解每条命令行为的最快方式。

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 15:40:18

电气图转梯形图:核心转换方法、典型实例与常见陷阱

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 15:29:21

CANoe离线报文回放:无硬件环境下的总线信号分析与故障定位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 15:28:39

高等代数核心考点:行列式、矩阵与方程组解题全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 15:28:24

Win10离线安装.NET Framework 3.5:DISM命令与0x8024402c错误排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 15:25:34

Docker 从入门到实践:核心概念、安装配置与常用命令全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华