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助你行銷加分!