嵌入式Linux裁剪Docker本质是精简依赖、定制构建、按需部署:一要启用内核cgroups、namespaces、overlayfs等必要功能;二要保留dockerd、runc、containerd等最小组件,静态或交叉编译,并精简配置与启动流程。

在嵌入式 Linux 系统上“裁剪安装 Docker”,本质不是 Docker 本身可裁剪(Docker 是用户态应用,不支持像内核那样配置选项),而是通过精简依赖、定制构建、按需部署的方式,让 Docker 运行环境适配资源受限的嵌入式平台。它包含两层工作:一是确保内核支持必要功能;二是构建轻量、可用的 Docker 运行时。
以下分三部分说明关键操作点:
内核必须启用的功能
Docker 依赖 cgroups、namespaces、overlayfs(或 aufs)等内核机制。裁剪内核时不能删掉这些,否则 dockerd 启动失败或容器无法运行:
-
General setup → Control Group support:必须开启(
CONFIG_CGROUPS=y) -
Namespaces support:全部启用(
CONFIG_NAMESPACES=y,CONFIG_PID_NS=y,CONFIG_NET_NS=y,CONFIG_USER_NS=y,CONFIG_IPC_NS=y,CONFIG_UTS_NS=y) -
Device Drivers → Block devices → Loopback device support:
CONFIG_BLK_DEV_LOOP=y(用于镜像挂载) -
File systems → Overlay filesystem support:
CONFIG_OVERLAY_FS=y(推荐,比 aufs 更主流且维护活跃) -
Networking support → Network packet filtering framework → iptables support:至少启用
CONFIG_IP_NF_IPTABLES=y和CONFIG_NETFILTER_XT_TARGET_REDIRECT=y(端口映射依赖) -
Security options → Kernel .config hardening:可关闭如
CONFIG_SECURITY_SELINUX等非必需模块,节省空间
⚠️ 注意:若使用旧内核(如 3.x 或 4.0 以下),overlayfs 可能不可用,需改用 aufs(需额外打补丁)或切换到
btrfs/devicemapper,但后者更耗资源。
构建轻量 Docker 运行时
官方 docker-ce 二进制默认含 dockerd、docker-cli、containerd、runc 等,但在嵌入式场景中:
-
只保留最小组件:
- 必需:
dockerd(守护进程)、runc(容器运行时)、containerd(容器生命周期管理) - 可选删减:
docker-compose-plugin、docker-buildx-plugin、docker-scan-plugin、docker-cli(若仅后台运行,无需交互命令)
- 必需:
-
静态编译或交叉编译:
- 使用
make binary-static(Docker 源码提供)生成静态链接的dockerd和runc,避免依赖目标系统 glibc 版本 - 若目标平台是 ARM32/ARM64/MIPS,需用对应交叉工具链编译
containerd和runc(Docker 官方不提供所有架构预编译包)
- 使用
-
精简根文件系统集成:
- 不装
apt/yum,直接拷贝二进制 + systemd/init 脚本 + 最小配置 -
/etc/docker/daemon.json示例(禁用不必要功能):{ "storage-driver": "overlay2", "iptables": false, "ip-forward": false, "live-restore": true, "no-new-privileges": true, "default-ulimits": {"nofile":{"Hard":65536,"Soft":65536}} }
- 不装
验证与启动策略
嵌入式系统通常无 systemd,需适配 init 系统或手动管理:
- 编写简易启动脚本(如
/etc/init.d/docker),确保containerd先于dockerd启动 - 关闭自动更新、日志轮转、metrics server 等后台服务(
--metrics-addr=留空,--log-level=warn) - 用
docker info | grep -E "(Kernel|Storage|Runtime)"快速确认核心功能就绪 - 测试最小容器:
docker run --rm alpine:3.18 echo ok(建议提前下载并docker load到本地,避免运行时拉取)
不复杂但容易忽略。


















