メインコンテンツへスキップ

AndroidスマホでDockerを動かす:Termuxにheadless Alpine Linux QEMU仮想マシンをインストールする

·
カテゴリー スマートフォン Termuxチュートリアル
タグ QEMU Docker Alpine Linux Android
目次

注:単にDockerを動かしたいだけなら、この記事の方法は性能がよくありません。より実用的な方法はこちらを参照してください:Androidスマホでネイティブ性能のDockerを動かす

We need to go deeper…

基本的に、Androidスマホではdockerを直接動かせません。kernelがそもそも対応していないからです。とはいえ、QEMU仮想マシンという手があります。ただし残念ながらKVMも使えません。

構成は、TermuxエミュレーターでQEMU仮想マシンを作成し、その仮想マシン内にDockerをインストールして、さらにポートフォワーディングする、という流れです。

スマホ:Sony Xperia 5 II、Android 11、8GB RAM。

簡単なApacheサーバーを例にして、仮想マシン内のdockerで作成したWebページをスマホのブラウザで表示できるか確認します。Webページの内容は以下のとおりです。

1. 仮想マシンを作成してDockerをインストールする
#

  1. Termuxを開き、コマンドを入力します。
pkg install qemu-utils qemu-common qemu-system-x86_64-headless
  1. virtを含むAlpine Linux OSのISOをダウンロードします
mkdir alpine && cd $_
wget http://dl-cdn.alpinelinux.org/alpine/v3.12/releases/x86_64/alpine-virt-3.12.3-x86_64.iso
  1. 4GBの仮想ハードディスクを作成します
qemu-img create -f qcow2 alpine.img 4G
  1. 起動します
qemu-system-x86_64 -machine q35 -m 1024 -smp cpus=2 -cpu qemu64 \
  -drive if=pflash,format=raw,read-only,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
  -netdev user,id=n1,hostfwd=tcp::2222-:22 -device virtio-net,netdev=n1 \
  -cdrom alpine-virt-3.12.3-x86_64.iso \
  -nographic alpine.img
  1. rootアカウントでログインし、ネットワークカードを有効化します。
setup-interfaces
#Available interfaces are: eth0.
#Enter '?' for help on bridges, bonding and vlans.
#Which one do you want to initialize? (or '?' or 'done') [eth0]
#Ip address for eth0? (or 'dhcp', 'none', '?') [dhcp]
#Do you want to do any manual network configuration? [no]
ifup eth0
  1. oofnikjが用意したanswerfileを使って、システムを素早くインストールします。
wget https://gist.githubusercontent.com/oofnikj/e79aef095cd08756f7f26ed244355d62/raw/answerfile
  1. 起動時にメッセージを出力できるようにします
sed -i -E 's/(local kernel_opts)=.*/\1="console=ttyS0"/' /sbin/setup-disk
  1. システムをハードディスクへインストールします。途中でrootアカウントのパスワード作成を求められます。
setup-alpine -f answerfile
  1. まずpoweroffコマンドでシャットダウンし、次にこのコマンドで仮想マシンを起動します(自分でスクリプトとして保存しても構いません)。
qemu-system-x86_64 -machine q35 -m 2048 -smp cpus=2 -cpu qemu64 \
  -drive if=pflash,format=raw,read-only=on,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
  -netdev user,id=n1,hostfwd=tcp::2222-:22,hostfwd=tcp::8081-:80 -device virtio-net,netdev=n1 \
  -nographic alpine.img
# mは2GBメモリの割り当て、cpuは2コアCPU、hostfwdはスマホの8081ポートを仮想マシンの80ポートへ転送します。
  1. dockerをインストールし、仮想マシン起動時にサービスが自動起動するよう設定します。
apk update && apk add docker
service docker start
rc-update add docker

2. Apacheサーバーをインストールする
#

  1. ApacheサーバーのイメージをPullします
docker pull httpd
  1. Apacheコンテナを実行し、仮想マシンの80ポートをDockerコンテナの80ポートへ転送します。さらにdockerコンテナのファイルパスをシステムの/root/websiteディレクトリに対応させます。
docker run -d -p 80:80 --name myapache -v /root/website/:/usr/local/apache2/htdocs/  httpd
  1. テスト用Webページを作成します
mkdir website && cd website
vi index.html
  1. Webページには次を入力します。
<!DOCTYPE html>
<html>
<body>
<h1>My Apache Server</h1>
<img src="https://c.tenor.com/61yCyJVoyr8AAAAd/%E6%A1%B6%E7%A5%9E-%E6%89%93%E5%B7%A5.gif">
</body>
</html>
  1. スマホでブラウザを開き、localhost:8081/index.htmlを入力すると、DockerのWebページが正常に表示されます。

3. まとめ
#

仮想マシン+DockerでApache Serverを動かす程度なら、そこそこ使えそうです。ただしMinecraftサーバーのようなものを実行すると、性能低下はかなり目立ちます。

仮想化の層を省けるなら、dockerの性能は大幅に上がりますし、Alpine Linuxの起動に30秒待つ必要もありません。そのため、kernelを変更してdockerを動かすほうが性能はよくなります。

ついでに言うと、iOSにはAlpine LinuxベースのiSH Shellターミナルエミュレーターがあります。理論上は同じようにdockerを動かせるはずです。

4. 参考資料
#


最後までお読みいただきありがとうございます。本サイトでは公開コメント欄を設けていません。私はソーシャルな反応やアクセス数を追い求めるためではなく、自分の考えを誠実に探求するために文章を書いています。記事を丁寧にお読みいただいたうえで、ご感想やご意見をお寄せいただければ幸いです。誤字・誤り・技術的な問題などを見つけた場合、またはフィードバックを共有したい場合は、Aboutページに記載しているメールアドレスまでお気軽にご連絡ください。