在嵌入式Android系统上运行Docker容器指南
目录
概述
本文档介绍如何在基于AOSP修改的嵌入式Android系统上运行Docker容器。系统运行在ARM64架构上,具有Linux命令行环境但无GUI界面。
系统环境
- 架构: ARM64-v8a (aarch64)
- 系统: 基于AOSP修改的嵌入式Android
- 内核: Linux 5.4.123-rt59
- 环境: 无GUI的Linux命令行环境
$ uname -a
Linux localhost 5.4.123-rt59-gf1e61d2ecff7-ab284490 #2 SMP PREEMPT_RT Thu Aug 28 21:29:22 CST 2025 aarch64
容器生态系统架构
完整的容器技术栈
┌─────────────────┐
│ Docker/Podman │ ← 用户友好的命令行工具
├─────────────────┤
│ containerd │ ← 容器运行时管理
├─────────────────┤
│ runc │ ← 底层容器运行时
└─────────────────┘
各组件说明
| 组件 | 层级 | 功能 | 特点 |
|---|---|---|---|
| Docker | 最高层 | 完整容器管理 | 功能丰富,生态完善 |
| Podman | 最高层 | 容器管理 | 无守护进程,更轻量 |
| containerd | 中间层 | 容器运行时管理 | 轻量级,高性能 |
| runc | 最底层 | 容器创建和运行 | 最轻量,直接调用内核 |
方案选择
方案1: Podman(推荐)
优势:
- 无守护进程,无需root权限
- 资源占用少,适合嵌入式环境
- 兼容Docker命令和镜像
- 更安全,不需要特权模式
安装步骤:
# 下载Podman静态二进制文件
wget https://github.com/containers/podman/releases/download/v4.8.2/podman-remote-static-linux_arm64.tar.gz
# 解压
tar -xzf podman-remote-static-linux_arm64.tar.gz
# 安装
cp podman-remote /usr/local/bin/podman
chmod +x /usr/local/bin/podman
# 创建配置目录
mkdir -p ~/.config/containers
mkdir -p ~/.local/share/containers
使用方法:
# 直接运行容器(无需后台服务)
podman run --rm hello-world
# 运行ARM64镜像
podman run --rm -it arm64v8/ubuntu:20.04 /bin/bash
# 如果需要后台服务模式
podman system service --time=0 &
方案2: containerd + nerdctl
优势:
- 最轻量级,性能最佳
- 被Kubernetes广泛采用
- 模块化设计
安装步骤:
# 下载containerd
wget https://github.com/containerd/containerd/releases/download/v1.7.13/containerd-1.7.13-linux-arm64.tar.gz
tar -xzf containerd-1.7.13-linux-arm64.tar.gz
cp bin/containerd /usr/local/bin/
cp bin/ctr /usr/local/bin/
chmod +x /usr/local/bin/containerd /usr/local/bin/ctr
# 下载nerdctl(提供Docker兼容命令)
wget https://github.com/containers/nerdctl/releases/download/v1.7.3/nerdctl-1.7.3-linux-arm64.tar.gz
tar -xzf nerdctl-1.7.3-linux-arm64.tar.gz
cp nerdctl /usr/local/bin/
chmod +x /usr/local/bin/nerdctl
使用方法:
# 启动containerd守护进程
containerd &
# 使用nerdctl(类似Docker命令)
nerdctl run --rm hello-world
nerdctl images
nerdctl ps
# 或使用原生命令
ctr run --rm docker.io/library/hello-world:latest test
方案3: Docker CE
优势:
- 功能最完整,生态最丰富
- 学习资源多,社区支持好
安装步骤:
# 下载Docker静态二进制文件
wget https://download.docker.com/linux/static/stable/aarch64/docker-24.0.7-aarch64.tgz
tar -xzf docker-24.0.7-aarch64.tgz
# 安装
cp docker/dockerd /usr/local/bin/
cp docker/docker /usr/local/bin/
chmod +x /usr/local/bin/dockerd /usr/local/bin/docker
# 创建Docker配置
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"storage-driver": "overlay2",
"iptables": false,
"ip-forward": false,
"bridge": "none"
}
EOF
使用方法:
# 启动Docker守护进程
dockerd --config-file /etc/docker/daemon.json &
# 使用Docker命令
docker run --rm hello-world
docker images
docker ps
技术细节
容器运行时层次
-
runc: 最底层,直接调用Linux内核
- 使用namespaces进行进程隔离
- 使用cgroups进行资源限制
- 遵循OCI标准
-
containerd: 中间层,管理容器生命周期
- 镜像管理
- 容器创建和销毁
- 网络和存储管理
-
Docker/Podman: 最高层,用户接口
- 提供友好的命令行工具
- 镜像构建和管理
- 网络和存储配置
实际调用链
用户命令 → Docker/Podman → containerd → runc → Linux内核
镜像管理和容器运行
ARM64架构镜像下载
您可以直接下载ARM64架构的预构建镜像,无需自己构建:
# 使用Podman下载ARM64 Ubuntu镜像
podman pull arm64v8/ubuntu:20.04
podman pull arm64v8/ubuntu:22.04
# 或者使用Docker Hub的官方ARM64镜像
podman pull ubuntu:20.04 # 自动选择ARM64版本
podman pull ubuntu:22.04
# 查看已下载的镜像
podman images
主要镜像源
- Docker Hub - 最常用的镜像仓库
- ARM64v8 - 专门为ARM64架构优化的镜像
- 官方镜像 - 如ubuntu、alpine、debian等
运行Ubuntu容器
基本运行命令
# 运行交互式Ubuntu容器
podman run -it --rm arm64v8/ubuntu:20.04 /bin/bash
# 或者使用官方Ubuntu镜像
podman run -it --rm ubuntu:20.04 /bin/bash
# 后台运行容器
podman run -d --name my-ubuntu arm64v8/ubuntu:20.04 sleep infinity
进入运行中的容器
# 进入后台运行的容器
podman exec -it my-ubuntu /bin/bash
# 查看运行中的容器
podman ps
网络配置
自动网络配置(推荐)
# 使用默认网络运行容器
podman run -it --rm --network host arm64v8/ubuntu:20.04 /bin/bash
# 或者让Podman自动分配网络
podman run -it --rm arm64v8/ubuntu:20.04 /bin/bash
手动网络配置
# 创建自定义网络
podman network create my-network
# 使用自定义网络运行容器
podman run -it --rm --network my-network arm64v8/ubuntu:20.04 /bin/bash
高级配置
挂载本地目录
# 挂载本地目录到容器
podman run -it --rm -v /path/to/local:/path/in/container arm64v8/ubuntu:20.04 /bin/bash
端口映射
# 映射端口(如果需要)
podman run -it --rm -p 8080:80 arm64v8/ubuntu:20.04 /bin/bash
环境变量
# 设置环境变量
podman run -it --rm -e MY_VAR=value arm64v8/ubuntu:20.04 /bin/bash
完整的操作示例
步骤1:安装Podman
# 下载并安装Podman
wget https://github.com/containers/podman/releases/download/v4.8.2/podman-remote-static-linux_arm64.tar.gz
tar -xzf podman-remote-static-linux_arm64.tar.gz
cp podman-remote /usr/local/bin/podman
chmod +x /usr/local/bin/podman
步骤2:下载Ubuntu镜像
# 下载ARM64 Ubuntu镜像
podman pull arm64v8/ubuntu:20.04
# 验证镜像下载
podman images
步骤3:运行Ubuntu容器
# 运行交互式Ubuntu容器
podman run -it --rm arm64v8/ubuntu:20.04 /bin/bash
步骤4:在容器内操作
# 更新软件包
apt update && apt upgrade -y
# 安装常用工具
apt install -y curl wget vim nano
# 检查网络连接
ping -c 3 8.8.8.8
# 退出容器
exit
常用操作命令
镜像管理
# 查看镜像
podman images
# 删除镜像
podman rmi arm64v8/ubuntu:20.04
# 清理未使用的镜像
podman image prune
容器管理
# 查看运行中的容器
podman ps
# 查看所有容器(包括停止的)
podman ps -a
# 停止容器
podman stop container_name
# 删除容器
podman rm container_name
# 清理停止的容器
podman container prune
网络访问测试
# 在容器内测试网络
podman run -it --rm arm64v8/ubuntu:20.04 /bin/bash
# 在容器内执行
apt update # 测试网络连接
ping -c 3 8.8.8.8 # 测试DNS解析
curl -I https://www.google.com # 测试HTTPS连接
验证安装
安装完成后,运行以下命令验证:
# 检查版本
podman --version
# 或
nerdctl --version
# 或
docker --version
# 运行测试容器
podman run --rm hello-world
# 或
nerdctl run --rm hello-world
# 或
docker run --rm hello-world
# 运行ARM64镜像
podman run --rm -it arm64v8/ubuntu:20.04 /bin/bash
注意事项
系统要求
-
内核支持: 确保内核支持以下功能
# 检查内核模块 lsmod | grep -E "(cgroup|namespace|overlay)" # 检查内核版本 uname -r -
存储空间: 容器镜像会占用大量存储空间
-
内存: 建议至少512MB可用内存
-
权限: 某些操作可能需要root权限
性能考虑
- 资源限制: 嵌入式设备性能有限,建议运行轻量级容器
- 存储优化: 使用overlay2存储驱动
- 网络配置: 可能需要禁用iptables和网络桥接
安全建议
- 权限控制: 避免使用特权模式运行容器
- 镜像安全: 使用官方或可信的镜像源
- 网络安全: 配置适当的网络隔离
推荐方案
根据您的嵌入式Android环境,推荐以下方案:
- 首选: Podman - 无守护进程,轻量级,适合嵌入式环境
- 备选: containerd + nerdctl - 最轻量,性能最佳
- 最后: Docker CE - 功能最全,但资源占用较大
故障排除
常见问题
- 权限问题: 确保有足够的权限运行容器
- 存储问题: 检查磁盘空间是否充足
- 网络问题: 配置适当的网络设置
- 内核问题: 确保内核支持必要的功能
- 镜像下载问题: 网络连接或镜像源问题
- 容器启动问题: 资源不足或配置错误
镜像相关故障排除
# 检查网络连接
ping -c 3 8.8.8.8
# 测试镜像仓库连接
curl -I https://registry-1.docker.io
# 清理镜像缓存
podman image prune -a
# 使用不同的镜像源
podman pull quay.io/ubuntu:20.04
网络相关故障排除
# 检查网络配置
podman run --rm arm64v8/ubuntu:20.04 ip addr show
# 测试DNS解析
podman run --rm arm64v8/ubuntu:20.04 nslookup google.com
# 使用host网络模式
podman run --rm --network host arm64v8/ubuntu:20.04 /bin/bash
容器启动故障排除
# 检查系统资源
free -h
df -h
# 以root用户运行
podman run -it --rm --user root arm64v8/ubuntu:20.04 /bin/bash
# 检查容器日志
podman logs container_name
调试命令
# 检查系统信息
uname -a
cat /proc/version
# 检查存储空间
df -h
# 检查内存使用
free -h
# 检查网络配置
ip addr show
总结
在嵌入式Android系统上运行Docker容器是完全可行的,但需要根据具体环境选择合适的方案。Podman是最推荐的方案,因为它无守护进程、轻量级,非常适合嵌入式环境。通过合理配置,您可以在ARM64架构的Android设备上成功运行各种容器化应用。