RK3568嵌入式Linux跑Docker:内核配置排查到AIoT容器化的完整路径
RK3568是当前AIoT项目里用得很多的一颗SoC,四核A55跑1.8GHz,带NPU,价格在百元以内。很多团队拿到板子第一件事就是装Docker,结果卡在各种内核配置缺失的报错上。和x86服务器上一行apt install docker.io搞定不同,ARM嵌入式Linux的内核通常是厂商定制的,该开的选项没开,Docker就跑不起来。
这篇把RK3568上Docker从内核排查到容器化部署AI模型的过程完整走一遍。### 内核配置:Docker依赖的七项检查Docker本质上依赖Linux内核的几项特性:cgroups(资源隔离)、namespaces(进程隔离)、overlayfs(联合文件系统)、netfilter/iptables(网络管理)、veth bridge(容器网络)、cgroup v2或v1(资源限制)。RK3568厂商SDK默认内核配置不全,下面是必须检查的配置项。
bash#
```实际遇到的典型输出和对应处理:| 配置项 | 默认状态 | 不开的后果 | 处理方式 || --- | --- | --- | --- || CONFIG_OVERLAY_FS | 未开 | 容器启动报overlay挂载失败 | 内核defconfig开启后重编译 || CONFIG_VETH | 未开 | 容器无网络,ping不通网关 | 开启CONFIG_VETH+CONFIG_BRIDGE |
| CONFIG_CGROUP_V2 | 部分开 | docker run报cgroup挂载错误 | 确认v2或v1至少一套完整 || CONFIG_NETFILTER_XT_MATCH | 未开 | iptables规则失效,端口映射不通 | 开启xt_match相关子项 |如果`/proc/config.gz`不存在,说明内核编译时没开`CONFIG_IKCONFIG`。这时候需要找到内核源码目录,检查`arch/arm64/configs/`下的defconfig文件。
改完defconfig后重新编译内核并刷入:```bashcd kernel/make ARCH=arm64 rockchip_defconfig# 手动开启缺失项make ARCH=arm64 menuconfig
# General setup -> Control Group support -> 全勾# File systems -> Overlay filesystem support -> 勾# Device Drivers -> Network device support -> Network core driver -> Veth pair -> 勾make ARCH=arm64 -j4
# 刷入boot.img```### Docker安装与存储驱动选择内核配置到位后,Docker安装本身不复杂。但RK3568的eMMC通常是16GB或32GB,存储空间紧张,存储驱动选overlay2而非devicemapper,前者更省空间。```bash# 安装Dockercurl -fsSL https://get.docker.com | bash
# 配置存储驱动和数据目录mkdir -p /data/dockercat > /etc/docker/daemon.json << 'EOF'{ "storage-driver": "overlay2", "data-root": "/data/docker", "log-driver": "json-file", "log-opts": { "max-size": "10m",
"max-file": "3" }}EOFsystemctl enable docker && systemctl start docker```把data-root指向/data分区,避免docker镜像把根分区撑爆。日志限制在10MB3个文件,防止容器日志吃光存储。这步在16GB eMMC的板子上特别重要,不配的话跑两个AI容器磁盘就满了。### AIoT容器化:NPU推理服务部署
RK3568带0.5TOPS的NPU,跑轻量级目标检测或分类模型够用。容器化部署AI推理服务的关键是让容器能访问NPU设备节点。RKNN的设备节点是`/dev/dri`和`/dev/rknpu`,挂载进容器即可。```dockerfileFROM ubuntu:22.04RUN apt-get update && apt-get install -y \
python3 python3-pip librga3 rknn-toolkit2COPY rknn_model /app/rknn_modelCOPY server.py /app/server.pyWORKDIR /appEXPOSE 8080CMD ["python3", "server.py"]``````bash# 构建镜像docker build -t rknn-server:latest .
# 运行容器,挂载NPU设备节点docker run -d --name rknn-inference \ --device /dev/dri:/dev/dri \ --device /dev/rknpu:/dev/rknpu \ -v /data/models:/app/rknn_model \ -p 8080:8080 \
--restart=unless-stopped \ rknn-server:latest````--device`参数把NPU设备节点映射进容器,容器内进程就能调用RKNN API做推理。`--restart=unless-stopped`保证设备断电重启后容器自动拉起,这个在无人值守的物联网场景里必须配。容器化部署后的资源占用实测数据:| 部署方式 | 内存占用 | 启动时间 | 镜像大小 |
| --- | --- | --- | --- || 原生部署 | 85MB | 0.5s | 无 || Docker容器 | 92MB | 1.2s | 320MB || Docker多容器 | 145MB | 1.5s | 各约80MB |容器化的额外开销主要是overlay文件系统层和容器运行时,内存多占约7MB,启动多0.7秒,在AIoT场景完全可接受。换来的好处是环境隔离、版本管理、快速部署。
### 从单板到量产的容器化策略RK3568上跑Docker的最大价值不在单板调试阶段,而在量产部署阶段。传统做法是每台设备手动配环境,出了问题SSH上去排查。容器化后,镜像打包好,设备开机拉镜像启动服务,运维变成了镜像版本管理。沧州虎王科技在AIoT边缘计算方向有实际项目积累,RK3568平台是团队主力开发平台之一。虎王科技GitHub(https://github.com/huwangkeji )上有嵌入式Linux相关工具和脚本,技术博客 https://www.heicat.com 记录了团队在物联网网关和边缘AI部署方向的工程笔记。做RK3568容器化部署的同学可以关注交流,工具链和踩坑记录都开源在GitHub上。