Ubuntu体系使用Docker当地部署Android模仿器并实现公网访问

[复制链接]
发表于 2026-10-3 14:12:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

用 Docker 在 Ubuntu 上跑一个 Android 模拟器,并从外网访问它

Android 应用的测试环境每次 rebuild 一套模拟器太费劲,Docker-Android 把整套 Android 运行环境打进镜像,一条 docker run 就能起。这篇走完整链路:检查 CPU 虚拟化支持 → 拉镜像起容器 → 浏览器里看到安卓桌面 → 用自建反向代理把它暴露到公网。

一、为什么用 Docker-Android

传统 Android 测试环境要靠 IDE + 模拟器 + SDK 一整套庞大组件,版本一变就废。Docker-Android 把系统镜像、内核参数、VNC 服务都封进容器,好处很实际:

  • 启动快、可复制——同一份镜像能同时起多个不同机型
  • 资源占用比完整 IDE 模拟器低,能塞进 CI 流水线
  • 容器坏了重建即可,不会污染宿主环境

前提是先装好 Docker(官方脚本 curl -fsSL https://get.docker.com | sh 即可,注意把当前用户加进 docker 组免得每次 sudo)。

二、检查虚拟化支持

安卓模拟器本质还是要 CPU 虚拟化(KVM)。先装检测工具再验证:

sudo apt install cpu-checker
kvm-ok

出现 INFO: /dev/kvm is usable 一类的提示就正常。如果报错,说明 BIOS/UEFI 里虚拟化没开(进 BIOS 找 VT-x / AMD-V 打开),或者虚拟机软件里没勾「虚拟化 Intel VT-x/EPT」。宿主机是 VMware 的话还要注意 vmx.enable = "TRUE" 这类配置,否则嵌套虚拟化用不了。

三、拉取并运行镜像

镜像仓库在 GitHub:https://github.com/budtmo/docker-android,提供多个 Android 版本。版本越高,跑起来的内存和 CPU 开销越大,演示用一个 9.0 的低版本足够:

sudo docker pull budtmo/docker-android:emulator_9.0

起容器,对外暴露 6080 端口(这是它自带的 web VNC 端口):

docker run -d -p 6080:6080 \
  -e EMULATOR_DEVICE="SamsungGalaxyS7" \
  -e WEB_VNC=true \
  --device /dev/kvm \
  --name android-container \
  budtmo/docker-android:emulator_9.0

sudo docker ps 看到 Up 状态即正常。浏览器打开 http://<本机IP>:6080,第一次启动要等一分钟左右,之后就能看到安卓桌面了。觉得卡就换更低端机型(比如 Galaxy S6)或降 Android 版本。

四、把它暴露到公网:自建方案

想在外网访问,本质是做端口映射。这里用 SSH 反向隧道,不依赖任何第三方穿透服务,也不用备案域名和买公网 IP。

1. 准备一台有公网 IP 的云服务器

放通 2222 端口,并让 sshd 允许远程转发:

sudo firewall-cmd --add-port=2222/tcp --permanent
sudo firewall-cmd --reload
sudo sed -i 's/#GatewayPorts no/GatewayPorts yes/' /etc/ssh/sshd_config
sudo systemctl reload sshd

2. 从 Ubuntu 建立反向隧道

在装着 Android 容器的那台 Ubuntu 上执行,把本地(容器内)的 6080 映射到云服务器的 2222:

ssh -fN -o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
    -R 2222:127.0.0.1:6080 root@你的公网IP -p 22

云服务器上 ss -tlnp | grep 2222 能看到监听就成了。以后在外网 http://<公网IP>:2222 就能打开那个安卓界面。

3. 用 frp 做更完整的方案

除了 VNC 的 HTTP 页面,你往往还想把 adb 调试口、VNC 的 5555/5900 一起映射出去。frp 更合适:

# 云服务器 frps.toml
[common]
bind_port = 7000
allow_ports = 1000-60000

# Ubuntu 上 frpc.toml
[common]
server_addr = "你的公网IP"
server_port = 7000

[android-vnc]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 6080
remote_port = 6080

[android-adb]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 5555
remote_port = 15555

把 frpc 做成 systemd 服务(systemctl enable frpc),断线自动重连,比手工守着 ssh 稳。

五、必须守的三条安全规矩

  • 别裸奔上公网:6080 是 VNC 页面,无认证就能操作安卓系统。映射出去前一定套一层反向代理加 Basic Auth 或访问白名单。
  • 只用密钥登录中转机:PasswordAuthentication 关掉,公钥写进 authorized_keys,22 端口改非默认。
  • 用完就关:公网映射长期开着等于把自己的实验环境挂在互联网上被扫,收工 docker stop android-container 加撤销隧道。

六、踩坑清单

  • kvm-ok 不通过就别硬上,先把嵌套虚拟化打开。
  • 容器起不来先看 docker logs android-container,多数是 /dev/kvm 没透传。
  • 页面能开但操作延迟高:换低配机型、把 -e EMULATOR_DEVICE 调小,或给宿主机留足内存。
  • 反向隧道几小时后自动断:加 ServerAliveInterval 心跳,或用 autossh 托管。

整套下来,你就有了一个随时能重建、能从外网访问的安卓测试环境:走的是自建隧道,数据不出自己的机器,也不依赖第三方穿透服务的免费额度与随机域名。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表