在嵌入式Android系统上运行Docker容器指南

13 阅读9分钟

在嵌入式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

技术细节

容器运行时层次

  1. runc: 最底层,直接调用Linux内核

    • 使用namespaces进行进程隔离
    • 使用cgroups进行资源限制
    • 遵循OCI标准
  2. containerd: 中间层,管理容器生命周期

    • 镜像管理
    • 容器创建和销毁
    • 网络和存储管理
  3. 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

主要镜像源

  1. Docker Hub - 最常用的镜像仓库
  2. ARM64v8 - 专门为ARM64架构优化的镜像
  3. 官方镜像 - 如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

注意事项

系统要求

  1. 内核支持: 确保内核支持以下功能

    # 检查内核模块
    lsmod | grep -E "(cgroup|namespace|overlay)"
    
    # 检查内核版本
    uname -r
    
  2. 存储空间: 容器镜像会占用大量存储空间

  3. 内存: 建议至少512MB可用内存

  4. 权限: 某些操作可能需要root权限

性能考虑

  1. 资源限制: 嵌入式设备性能有限,建议运行轻量级容器
  2. 存储优化: 使用overlay2存储驱动
  3. 网络配置: 可能需要禁用iptables和网络桥接

安全建议

  1. 权限控制: 避免使用特权模式运行容器
  2. 镜像安全: 使用官方或可信的镜像源
  3. 网络安全: 配置适当的网络隔离

推荐方案

根据您的嵌入式Android环境,推荐以下方案:

  1. 首选: Podman - 无守护进程,轻量级,适合嵌入式环境
  2. 备选: containerd + nerdctl - 最轻量,性能最佳
  3. 最后: Docker CE - 功能最全,但资源占用较大

故障排除

常见问题

  1. 权限问题: 确保有足够的权限运行容器
  2. 存储问题: 检查磁盘空间是否充足
  3. 网络问题: 配置适当的网络设置
  4. 内核问题: 确保内核支持必要的功能
  5. 镜像下载问题: 网络连接或镜像源问题
  6. 容器启动问题: 资源不足或配置错误
镜像相关故障排除
# 检查网络连接
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设备上成功运行各种容器化应用。