Docker 容器解决了「在我机器上能跑」的问题,但却引入了一个新问题:「在安装了 Docker 的机器上能跑」。容器需要 Docker daemon、containerd,或至少需要一个容器运行时。对于分发命令行工具、桌面应用程序或部署产物来说,这种依赖是一项负担。Dockerc 采用了一种截然不同的方法——它将整个 Docker 镜像编译为独立的二进制可执行文件。
用 Zig 编写,位于 github.com/NilsIrl/dockerc,Dockerc 读取 Docker 镜像的各层,并生成一个单一的、自包含的二进制文件,其中嵌入了文件系统、入口点和运行时配置。执行时,二进制文件会将自己解压缩到内存中的文件系统(通过 tmpfs),设置进程命名空间,然后运行应用程序。不需要 Docker、不需要 containerd、也不需要 root 权限。
这种方法对于将 CLI 工具、自动化脚本和实用程序分发到 Docker 不可用的环境特别有吸引力——CI 运行器、锁定的服务器、气隙系统或终端用户的机器。生成的二进制文件可在具有相同内核架构的 Linux 系统之间移植。
什么是 Dockerc?
Dockerc 是一个将 Docker 容器镜像编译为独立、可移植二进制可执行文件的工具。它用 Zig 编写,生成静态链接的二进制文件,其中嵌入了完整的容器文件系统。生成的二进制文件可在任何相同架构的 Linux 系统上运行,无需 Docker、containerd 或任何其他容器运行时。
如何使用 Dockerc?
使用方式遵循直接的编译后运行模式:
# 将 Docker 镜像编译为二进制文件
dockerc --image alpine:latest --output myapp.bin
# 运行生成的二进制文件(不需要 Docker)
./myapp.bin
# 带参数编译
dockerc --image nginx:alpine --output webserver.bin --entrypoint nginx
编译过程会提取镜像层、创建 squashfs 文件系统,并将其嵌入用 Zig 编写的最小启动器二进制文件中。
支持哪些架构?
Dockerc 的架构支持取决于工具的编译目标和源镜像的平台。
| 主机架构 | 目标架构 | 状态 |
|---|---|---|
| x86_64 Linux | x86_64 容器 | 完整支持 |
| x86_64 Linux | ARM64 容器 | 实验性(QEMU 用户模式) |
| ARM64 Linux | ARM64 容器 | 完整支持 |
| ARM64 Linux | x86_64 容器 | 实验性 |
| macOS | Linux 容器 | 仅交叉编译 |
| Windows | Linux 容器 | 不支持 |
核心限制在于 Linux 内核系统调用的兼容性。生成的二进制文件会在无模拟的情况下原生运行,因此二进制文件的架构必须与主机内核匹配。
Dockerc 有哪些限制?
虽然功能强大,但 Dockerc 有重要的限制需要了解。
| 方面 | 限制 | 缓解措施 |
|---|---|---|
| 文件大小 | 二进制文件包含完整容器文件系统 | 使用精简/alpine 基础镜像 |
| 启动时间 | 首次运行时将文件系统提取到 tmpfs | 小镜像时影响极小 |
| 挂载支持 | 无卷挂载 | 手动复制文件进出 |
| 网络 | 继承主机网络堆栈 | 配合主机防火墙规则使用 |
| GPU 访问 | 无直接 GPU 穿透 | 使用主机库 |
| 持久存储 | 仅内存(tmpfs) | 明确的保存/加载机制 |
| 信号处理 | 基本 | 支持主进程 |
对于 CLI 工具、批处理作业和无状态工作负载,这些限制很少造成问题。对于有状态服务或 GPU 应用程序,传统的容器设置更为合适。
可以从源代码构建 Dockerc 吗?
可以。Dockerc 用 Zig 编写,从源代码构建需要 Zig 编译器:
# 克隆仓库
git clone https://github.com/NilsIrl/dockerc.git
cd dockerc
# 使用 Zig 构建
zig build
# 二进制文件位于 ./zig-out/bin/dockerc
./zig-out/bin/dockerc --version
预构建的二进制文件也可从 GitHub Releases 页面获取,供不想安装 Zig 工具链的用户使用。
常见问题
什么是 Dockerc?
Dockerc 是一个用 Zig 编写的工具,可将 Docker 镜像编译为独立、可移植的二进制可执行文件。这些二进制文件可在任何 Linux 系统上运行,无需安装 Docker 或任何容器运行时。
如何使用 Dockerc?
使用 dockerc --image <name> --output <file> 将镜像编译为二进制文件。生成的二进制文件直接用 ./<file> 运行。Docker 镜像中的入口点和默认命令会保留下来。
支持哪些架构?
x86_64 和 ARM64 Linux 主机可以编译和运行其原生架构的二进制文件。跨架构支持(例如在 x86_64 上运行 ARM64 容器)通过 QEMU 用户模式提供实验性支持。macOS 和 Windows 不支持作为运行时目标。
Dockerc 有哪些限制?
生成的二进制文件包含完整的容器文件系统(文件较大)、在内存中运行(默认无持久存储),且不支持卷挂载或 GPU 穿透。最适合 CLI 工具和无状态工作负载。
可以从源代码构建 Dockerc 吗?
可以。克隆仓库并运行 zig build。您需要安装 Zig 编译器。预构建的二进制文件也可从 GitHub Releases 获取。
延伸阅读
flowchart LR
A[Docker 镜像] --> B[提取层]
B --> C[创建 squashfs]
C --> D[嵌入启动器]
D --> E[独立二进制文件]
E --> F{部署到}
F --> G[无 Docker 主机]
F --> H[CI 运行器]
F --> I[气隙系统]
F --> J[终端用户机器]
G --> K[运行二进制文件]
H --> K
I --> K
J --> K
K --> L[tmpfs 解压缩]
L --> M[运行应用程序]graph TD
subgraph 二进制文件结构
A[启动器标头] --> B[Zig 运行时]
A --> C[内嵌 squashfs]
A --> D[入口点配置]
end
subgraph 执行流程
B --> E[创建 tmpfs]
E --> F[解压缩 squashfs]
F --> G[设置命名空间]
G --> H[执行入口点]
end
subgraph 优势
H --> I[无需 Docker Daemon]
H --> J[无需 Root 权限]
H --> K[单一文件分发]
end
無程式碼也能輕鬆打造專業LINE官方帳號!一鍵導入模板,讓AI助你行銷加分!