一個用 C 語言實現的簡單容器程式,可以運行隔離的 bash 環境。
- 進程隔離: 使用 PID 命名空間隔離進程
- 文件系統隔離: 使用 chroot 和掛載命名空間
- 主機名隔離: 使用 UTS 命名空間
- IPC 隔離: 使用 IPC 命名空間
- 用戶隔離: 使用用戶命名空間(USER namespace)進行權限隔離
- 資源限制: 使用 cgroups 限制 CPU、記憶體和進程數
- 多容器支持: 可同時運行多個獨立容器
make第一次運行時,程式會提示創建基礎容器映像(約需 10-30 秒):
sudo ./main程式會詢問是否創建基礎映像,輸入 y 確認。這個映像只需創建一次,後續所有容器都將重用它。
創建基礎映像後,容器啟動將變得非常快速:
sudo ./mainsudo ./main可以在多個終端同時啟動多個容器:
# 終端 1
sudo ./main
# 終端 2
sudo ./main
# 終端 3
sudo ./main每個容器都有:
- 唯一的容器 ID
- 獨立的根目錄
/tmp/container_root_<ID> - 獨立的 cgroup
docker_in_c_container_<ID> - 完全隔離的命名空間
- ls, cat, cp, mv, rm, mkdir, find, grep, pwd
如果您在更新程式碼後需要重建基礎映像,請執行:
# 刪除舊的基礎映像
sudo rm -rf /tmp/docker_in_c_base_rootfs
# 重新運行程式,將會自動創建新的基礎映像
sudo ./main- 使用
clone()系統調用創建帶有新命名空間的子進程 - 設置用戶命名空間 UID/GID 映射,實現權限隔離
- 設置 cgroups 資源限制(CPU、記憶體、進程數)
- 在子進程中設置容器根目錄和基本文件系統結構
- 使用
chroot()改變根目錄實現文件系統隔離 - 掛載必要的文件系統(proc, sys, devpts)
- 執行 /bin/bash
- 命名空間: CLONE_NEWPID, CLONE_NEWNS, CLONE_NEWUTS, CLONE_NEWIPC, CLONE_NEWUSER
- 用戶映射: 將容器內的 root (UID 0) 映射到主機當前用戶,提供安全隔離
- 資源限制: cgroups v1/v2 自動檢測和配置
- 記憶體限制: 512 MB
- CPU 配額: 50% (可配置)
- 最大進程數: 100
- 文件系統隔離: chroot + mount
- 終端設備: /dev/pts, /dev/tty, /dev/console
- 依賴複製: 自動複製二進制文件及其依賴庫
程式會自動檢測系統使用的 cgroup 版本(v1 或 v2),並相應配置資源限制。
cgroup_limits_t limits = {
.memory_limit_mb = 512, // 記憶體限制 512 MB
.cpu_shares = 512, // CPU 份額(預設 1024 的一半)
.cpu_quota_us = 50000, // CPU 配額 50%
.pids_max = 100 // 最多 100 個進程
};您可以在 main.c 的 main() 函數中修改 cgroup_limits_t 結構來調整資源限制:
- memory_limit_mb: 記憶體限制(MB),設為 0 表示不限制
- cpu_shares: CPU 份額(範圍 2-262144,預設 1024)
- cpu_quota_us: CPU 配額(微秒/100ms),50000 = 50%
- pids_max: 最大進程數,設為 0 表示不限制
進入容器後,可以使用以下指令查看資源使用情況:
# 查看記憶體使用
free -h
# 查看進程列表
ps aux
# 查看系統資源
top# 在容器內執行
id # 查看用戶身份
whoami # 應顯示 root
cat /proc/self/uid_map # 查看 UID 映射
ls -la /etc/passwd # 查看系統文件
echo test > /tmp/test.txt # 測試文件操作
clear # 清屏# 在容器內創建文件
touch /tmp/usertest
ls -la /tmp/usertest # 顯示所有者為 root
# 在主機查看(另一個終端)
ls -la /tmp/container_root_*/tmp/usertest
# 顯示所有者為 paulboul1013 (1000) ✓這是一個簡化的實現,不包含以下功能:
- 網路隔離(CLONE_NEWNET)
- 安全性加強(seccomp, AppArmor)
- 鏡像管理
- 持久化存儲(volumes)
docker_in_c/
├── main.c # 主程式源代碼
├── cgroup.h # cgroup 相關函式標頭檔
├── cgroup.c # cgroup 相關函式實作
├── namespace.h # namespace 相關函式標頭檔
├── namespace.c # namespace 相關函式實作
├── rootfs.h # rootfs 管理函式標頭檔
├── rootfs.c # rootfs 管理函式實作
├── Makefile # 編譯配置
├── README.md # 說明文件
- main.c: 容器的主要邏輯,包含容器初始化、掛載文件系統等
- cgroup.h / cgroup.c: cgroup 資源限制管理模組
- 自動檢測 cgroup 版本(v1/v2)
- 設置記憶體、CPU、進程數限制
- 清理 cgroup 資源
- namespace.h / namespace.c: 命名空間管理模組
- 獲取真實用戶 UID/GID(支援 sudo)
- 設置用戶命名空間的 UID/GID 映射
- 實現容器與主機的權限隔離
- rootfs.h / rootfs.c: 容器文件系統管理模組
- 基礎映像機制:類似官方 Docker,只需構建一次
- 自動複製系統命令及其依賴庫
- 創建必要的設備文件和系統配置
- 大幅提升容器啟動速度(10-20倍)
paulboul1013