Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新

Jan 4, 2026 - 日記

docker-android: WebブラウザからAndroidエミュレータを操作するDocker環境

docker-android: WebブラウザからAndroidエミュレータを操作するDocker環境 cover image

docker-android は、Android エミュレータをDocker コンテナ内で動作させ、Web ブラウザから遠隔操作できるようにするオープンソースプロジェクトです。Android Studioをインストールすることなく、CI/CD パイプラインでのテスト 自動化やクラウド環境でのスケーラブルな Android テスト基盤を構築できます。

本記事では、docker-android の概要、セットアップ方法、基本的な使い方、そして実践的な活用例を紹介します。

docker-android とは?

docker-android は、budtmo 氏によって開発されている Docker ベースの Android エミュレータ環境です。主な特徴は以下の通りです。

主な特徴

  • Web ブラウザからのアクセス: noVNC を使用して、ブラウザから Android 画面を直接操作
  • 複数バージョン対応: Android 5.0 から最新バージョンまでサポート
  • CI/CD 統合: Jenkins、GitLab CI、GitHub Actions などと簡単に統合可能
  • Appium 対応: テスト自動化フレームワークと連携可能
  • スケーラビリティ: Kubernetes や Docker Swarm でのスケールアウトに対応

アーキテクチャ

docker-android は以下のコンポーネントで構成されています。

graph TB
    Browser[Webブラウザ]
    noVNC[noVNC Server
Port: 6080] VNC[VNC Server] Emulator[Android Emulator
AVD] Appium[Appium Server
Port: 4723
オプション] ADB[ADB Server
Port: 5554/5555] Browser -->|HTTP| noVNC noVNC -->|VNC Protocol| VNC VNC --> Emulator Appium --> ADB ADB --> Emulator style Browser fill:#e1f5ff style Emulator fill:#a5d6a7 style noVNC fill:#fff59d style Appium fill:#ffcc80

主要コンポーネント:

  • Android エミュレータ: Android SDK の AVD(Android Virtual Device)
  • noVNC: VNC をブラウザから利用できるようにする Web インターフェース
  • Appium サーバー: テスト自動化用の WebDriver サーバー(オプション)
  • ADB(Android Debug Bridge): デバッグとコマンド実行用

セットアップ

前提条件

  • Docker : 20.10 以上
  • ハードウェア仮想化: Intel VT-x または AMD-V が有効化されていること
  • メモリ: 最低 4GB(推奨 8GB 以上)

基本的な起動方法

最もシンプルな使い方は、以下のコマンドで Android 11 エミュレータを起動することです。

1
2
3
docker run -d -p 6080:6080 -p 5554:5554 -p 5555:5555 \
  --name android-container \
  budtmo/docker-android:emulator_11.0

起動後、ブラウザで http://localhost:6080 にアクセスすると、Android 画面が表示されます。

ポートの説明

ポート用途
6080noVNC(Web インターフェース)
5554ADB コンソールポート
5555ADB デバッグポート
4723Appium サーバー(Appium イメージ使用時)

基本的な使い方

Web ブラウザからの操作

  1. ブラウザで http://localhost:6080 にアクセス
  2. 画面をクリック、ドラッグ、スワイプで Android を操作
  3. キーボード入力も可能

ADB 経由での操作

Docker ホストから ADB でコンテナ内の Android にアクセスできます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ADB 接続
adb connect localhost:5555

# デバイス一覧確認
adb devices

# アプリのインストール
adb install my-app.apk

# シェルアクセス
adb shell

Docker Compose での構成

複数のエミュレータを起動する場合は、Docker Compose を使用すると便利です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3'
services:
  android-11:
    image: budtmo/docker-android:emulator_11.0
    ports:
      - "6080:6080"
      - "5554:5554"
      - "5555:5555"
    environment:
      - DEVICE=Samsung Galaxy S10
      - DATAPARTITION=4g
    privileged: true

  android-13:
    image: budtmo/docker-android:emulator_13.0
    ports:
      - "6081:6080"
      - "5556:5554"
      - "5557:5555"
    environment:
      - DEVICE=Pixel 6
      - DATAPARTITION=4g
    privileged: true

起動コマンド:

1
docker-compose up -d

これにより、Android 11 と Android 13 の 2 つのエミュレータが起動し、それぞれ異なるポートでアクセスできます。

Appium を使ったテスト自動化

docker-android には Appium サーバーが組み込まれたイメージも用意されています。Appiumは、モバイルアプリケーションのテスト自動化を実現するオープンソースフレームワークです。

Appium イメージの起動

1
2
3
docker run -d -p 6080:6080 -p 4723:4723 -p 5555:5555 \
  --name appium-android \
  budtmo/docker-android:emulator_11.0_appium

Python + Appium のテストコード例

以下は、Appium で Android アプリをテストする Python コードの例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from appium import webdriver
from appium.options.android import UiAutomator2Options

# Appium サーバーの設定
options = UiAutomator2Options()
options.platform_name = 'Android'
options.platform_version = '11'
options.device_name = 'emulator-5554'
options.app = '/path/to/your/app.apk'

# Appium サーバーに接続
driver = webdriver.Remote('http://localhost:4723', options=options)

# テスト実行例
try:
    # 要素を取得してクリック
    element = driver.find_element('id', 'com.example:id/button')
    element.click()
    
    # テキスト入力
    input_field = driver.find_element('id', 'com.example:id/input')
    input_field.send_keys('Hello, docker-android!')
    
    print("テスト成功")
finally:
    driver.quit()

CI/CD パイプラインでの使用例(GitHub Actions)

以下は、GitHub Actions で docker-android を使用してテストを実行する例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
name: Android UI Tests

on:
  push:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v3
      
      - name: Start Android emulator
        run: |
          docker run -d -p 4723:4723 -p 5555:5555 \
            --name android-emulator \
            budtmo/docker-android:emulator_11.0_appium
          
          # エミュレータの起動を待機
          sleep 30
      
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      
      - name: Install dependencies
        run: |
          pip install appium-python-client pytest
      
      - name: Run tests
        run: |
          pytest tests/test_android.py
      
      - name: Stop emulator
        if: always()
        run: docker stop android-emulator

環境変数によるカスタマイズ

docker-android では、以下の環境変数でエミュレータの動作をカスタマイズできます。

環境変数説明デフォルト値
DEVICEデバイスモデル名Samsung Galaxy S10
DATAPARTITIONデータパーティションサイズ2g
EMULATOR_TIMEOUT起動タイムアウト(秒)300
RELAXED_SECURITYAppium のセキュリティ緩和false

使用例:

1
2
3
4
docker run -d -p 6080:6080 -p 5555:5555 \
  -e DEVICE="Pixel 6" \
  -e DATAPARTITION="4g" \
  budtmo/docker-android:emulator_13.0

クラウド環境での活用

AWS ECS での構成例

docker-android は AWS ECS や GCP Cloud Run などのコンテナオーケストレーション環境でも動作します。

以下は、AWS ECS タスク定義の例です(一部抜粋)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
  "family": "android-emulator-task",
  "containerDefinitions": [
    {
      "name": "android-emulator",
      "image": "budtmo/docker-android:emulator_11.0_appium",
      "memory": 4096,
      "cpu": 2048,
      "essential": true,
      "portMappings": [
        {
          "containerPort": 6080,
          "protocol": "tcp"
        },
        {
          "containerPort": 4723,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {
          "name": "DEVICE",
          "value": "Samsung Galaxy S10"
        },
        {
          "name": "DATAPARTITION",
          "value": "4g"
        }
      ]
    }
  ],
  "requiresCompatibilities": ["FARGATE"],
  "networkMode": "awsvpc",
  "cpu": "2048",
  "memory": "4096"
}

Kubernetes での構成例

Kubernetes での Deployment 例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
apiVersion: apps/v1
kind: Deployment
metadata:
  name: android-emulator
spec:
  replicas: 3
  selector:
    matchLabels:
      app: android-emulator
  template:
    metadata:
      labels:
        app: android-emulator
    spec:
      containers:
      - name: android
        image: budtmo/docker-android:emulator_11.0_appium
        ports:
        - containerPort: 6080
        - containerPort: 4723
        resources:
          limits:
            memory: "4Gi"
            cpu: "2"
          requests:
            memory: "2Gi"
            cpu: "1"
        env:
        - name: DEVICE
          value: "Pixel 6"
        - name: DATAPARTITION
          value: "4g"
---
apiVersion: v1
kind: Service
metadata:
  name: android-emulator-service
spec:
  selector:
    app: android-emulator
  ports:
  - name: novnc
    port: 6080
    targetPort: 6080
  - name: appium
    port: 4723
    targetPort: 4723
  type: LoadBalancer

パフォーマンスとリソース管理

リソース要件

1 つのエミュレータあたりの推奨リソース:

  • CPU: 2 コア以上
  • メモリ: 4GB 以上(Android 11 以降は 8GB 推奨)
  • ディスク: 10GB 以上

並列実行時の注意点

複数のエミュレータを同時に起動する場合、以下の点に注意してください。

  • ポート番号の重複を避ける
  • ホストマシンのリソースを適切に配分する
  • Docker の --cpus--memory オプションでリソース制限を設定

並列実行例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# エミュレータ 1
docker run -d -p 6080:6080 -p 5555:5555 \
  --cpus="2" --memory="4g" \
  --name android-1 \
  budtmo/docker-android:emulator_11.0

# エミュレータ 2
docker run -d -p 6081:6080 -p 5556:5555 \
  --cpus="2" --memory="4g" \
  --name android-2 \
  budtmo/docker-android:emulator_11.0

トラブルシューティング

エミュレータが起動しない場合

原因: ハードウェア仮想化が無効

解決方法: BIOS で Intel VT-x または AMD-V を有効化してください。Linux の場合は KVM が利用可能か確認します。

1
2
# KVM が利用可能か確認
egrep -c '(vmx|svm)' /proc/cpuinfo

noVNC が接続できない場合

原因: ポートマッピングが正しくない

解決方法: -p オプションでポートが正しくマッピングされているか確認してください。

1
2
# ポート使用状況の確認
docker port android-container

メモリ不足エラー

原因: コンテナに割り当てられたメモリが不足

解決方法: --memory オプションでメモリを増やすか、DATAPARTITION 環境変数を小さくします。

1
2
3
4
docker run -d -p 6080:6080 -p 5555:5555 \
  --memory="8g" \
  -e DATAPARTITION="2g" \
  budtmo/docker-android:emulator_11.0

Android Studio Emulator との比較

項目docker-androidAndroid Studio Emulator
セットアップの簡単さ◎(Docker のみ)△(Android Studio 必須)
CI/CD 統合◎(簡単)△(設定が複雑)
リモートアクセス◎(ブラウザ経由)×(VNC 等が必要)
パフォーマンス○(若干遅い)◎(ネイティブ並み)
スケーラビリティ◎(コンテナ化)△(手動管理)
GPU サポート△(制限あり※)◎(完全サポート)

※ コンテナ環境でのGPU passthrough設定が必要

docker-android は CI/CD やクラウド環境での自動テストに適している一方、ローカル開発では Android Studio Emulator の方がパフォーマンスに優れています。

まとめ

docker-android を使用することで、Android エミュレータの環境構築が大幅に簡素化され、CI/CD パイプラインでのテスト自動化やクラウド環境でのスケーラブルなテスト基盤の構築が容易になります。

主なメリットは以下の通りです。

  • Android Studio 不要で、ブラウザから Android を操作可能
  • Docker コンテナとして管理できるため、環境の再現性が高い
  • Appium と組み合わせることで、強力なテスト自動化が実現可能
  • Kubernetes や ECS でスケールアウト可能

CI/CD でのテスト自動化やクラウド環境での Android テスト基盤を検討している方は、ぜひ試してみてください。

関連記事

参考リンク