一条命令在 Docker 容器里跑起 Android 模拟器:从本地启动到 CI 集成
【免费下载链接】docker-androidAndroid in docker solution with noVNC supported, video recording and mcp server项目地址: https://gitcode.com/GitHub_Trending/do/docker-android
想在 Docker 容器里运行 Android 模拟器做自动化测试吗?Docker-Android 把完整的 Android 模拟器环境打包成容器镜像,内置 noVNC 可视化、视频录制与 MCP server,一条docker run命令就能拉起三星、Nexus 等机型的模拟器,并支持 KVM 硬件加速。
二、启动之前:30 秒自检你的环境
容器化的模拟器能否流畅运行,取决于宿主机是否具备 KVM 硬件虚拟化。花 30 秒过一遍下面这份清单,后面能少走很多弯路 🛠️
| 检查项 | 一条命令 | 通过标准 |
|---|---|---|
| Docker 已安装 | docker --version | 输出版本号 |
| KVM 硬件虚拟化已启用 | sudo apt install cpu-checker && kvm-ok | 提示可使用 KVM 加速 |
| KVM 模块已加载 | lsmod \| grep kvm | 出现kvm相关模块 |
| 当前用户有 KVM 权限 | groups \| grep kvm | 用户在kvm组内 |
提示:macOS 和 Windows 用户无法直接运行该镜像,需要先装一个支持虚拟化的 Ubuntu 虚拟机。
三、一条命令启动 Android 11 容器
环境就绪后,启动一个三星 Galaxy S10 的 Android 11 模拟器,只需要这一条命令:
docker run -d -p 6080:6080 \ -e EMULATOR_DEVICE="Samsung Galaxy S10" \ -e WEB_VNC=true \ --device /dev/kvm \ --name android-container \ budtmo/docker-android:emulator_11.0关键点拆开看:
--device /dev/kvm:把宿主机的 KVM 设备透传进容器,模拟器才跑得快-e EMULATOR_DEVICE:指定设备画像,可选机型涵盖 Samsung Galaxy S6~S10、Nexus 4/5/7、Pixel C 等-e WEB_VNC=true:开启 Web 界面,随时看容器里的"屏幕"
启动后做两件事:
- 浏览器打开
http://localhost:6080,即可实时查看容器内模拟器的界面 - 用下面的命令确认模拟器是否就绪:
docker exec -it android-container cat device_status镜像版本从 Android 9 到 14 都有对应 tag(如emulator_11.0),按需选择即可。
四、容器里能干什么:三个真实场景
场景一:Appium 自动化测试
在容器内直接内嵌了 Appium 服务,只需多开一个端口、多传一个环境变量,测试框架就能对着模拟器跑用例:
docker run -d -p 6080:6080 -p 4723:4723 \ -e EMULATOR_DEVICE="Samsung Galaxy S10" \ -e WEB_VNC=true -e APPIUM=true \ --device /dev/kvm --name android-container \ budtmo/docker-android:emulator_11.0测试过程中想"肉眼看"模拟器在干什么?通过 noVNC(6080 端口)打开网页即可;Appium 服务需要额外参数时,用APPIUM_ADDITIONAL_ARGS环境变量透传。详见 Appium 用例文档。
场景二:模拟短信,验证应用的短信处理逻辑
很多 App 依赖验证码短信做登录验证,没有真机也能测。一条adb emu命令就能给容器内的模拟器"发"一条短信:
docker exec -it android-container adb emu sms send 12345678 "测试消息"发送后在 Web 界面里就能看到短信落在系统消息应用中,完整流程见 SMS 模拟文档:
场景三:接入 CI/CD 与云端部署
模拟器的"身体"在容器里,"神经"却可以伸到外面。只需在docker run时多映射 5554/5555 两个端口,宿主机上的 ADB 就能像操作本地设备一样操作容器内的模拟器:
adb connect <容器IP>:5555这样 Jenkins 流水线里就能直接编排"启动容器 → adb 连入 → 执行测试 → 销毁容器"的完整闭环,见 Jenkins 集成文档。同样的玩法也适用于 AWS、Azure、GCP 等云平台,按需弹性伸缩 Android 测试环境,方案见 云端部署文档:
五、让模拟器数据活过容器重启
默认行为是"容器销毁,数据陪葬":重启容器后,装过的 App、登录的状态全部清零。想让数据活下来,挂载一个卷到/home/androidusr即可:
docker run -v android_data:/home/androidusr budtmo/docker-android:emulator_11.0从此容器怎么重启、重建,设备数据都原样保留,测试环境的状态可以长期积累。
六、调优与排障速查
现象:容器起不来,提示 KVM 不可用
- 排查:
lsmod | grep kvm看模块、kvm-ok看硬件支持 - 解法:内核未加载
kvm模块时先加载;用户不在kvm组时执行sudo usermod -a -G kvm $USER后重新登录会话
现象:外部 ADB 连不进容器里的模拟器
- 排查:确认启动时是否映射了
-p 5554:5554 -p 5555:5555 - 解法:补上端口映射重启容器,再执行
adb connect <容器IP>:5555,参考 远程控制文档
现象:模拟器卡顿、资源占用高
- 排查:看当前
EMULATOR_DEVICE选的是什么画像、容器分到多少内存 - 解法:换成 Nexus 5 这类轻量机型画像;用
--cpus、-m限制资源;不需要显示画面时可了解无头模式(Pro 版特性)
现象:想改设备名、数据分区大小、Appium 参数
- 排查:查环境变量支持列表
- 解法:
EMULATOR_NAME改模拟器名,EMULATOR_DATA_PARTITION调数据分区,APPIUM_ADDITIONAL_ARGS传 Appium 参数,完整清单见 自定义配置文档
七、把 Android 测试环境变成"即插即用"
Docker-Android 的核心价值一句话:一条docker run,换来一台带 KVM 加速、可随时远程操控的 Android 模拟器,本地、CI、云端三处环境完全一致。
如果本文对你有帮助,可以直接把项目拉到本地体验:
git clone https://gitcode.com/GitHub_Trending/do/docker-android现在就挑一台机型,跑通你的第一条命令吧 🚀
【免费下载链接】docker-androidAndroid in docker solution with noVNC supported, video recording and mcp server项目地址: https://gitcode.com/GitHub_Trending/do/docker-android
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考