注:単に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をインストールする#
- Termuxを開き、コマンドを入力します。
pkg install qemu-utils qemu-common qemu-system-x86_64-headless- 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- 4GBの仮想ハードディスクを作成します
qemu-img create -f qcow2 alpine.img 4G- 起動します
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.imgrootアカウントでログインし、ネットワークカードを有効化します。
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- oofnikjが用意したanswerfileを使って、システムを素早くインストールします。
wget https://gist.githubusercontent.com/oofnikj/e79aef095cd08756f7f26ed244355d62/raw/answerfile- 起動時にメッセージを出力できるようにします
sed -i -E 's/(local kernel_opts)=.*/\1="console=ttyS0"/' /sbin/setup-disk- システムをハードディスクへインストールします。途中でrootアカウントのパスワード作成を求められます。
setup-alpine -f answerfile- まず
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ポートへ転送します。- dockerをインストールし、仮想マシン起動時にサービスが自動起動するよう設定します。
apk update && apk add docker
service docker start
rc-update add docker2. Apacheサーバーをインストールする#
- ApacheサーバーのイメージをPullします
docker pull httpd- Apacheコンテナを実行し、仮想マシンの80ポートをDockerコンテナの80ポートへ転送します。さらにdockerコンテナのファイルパスをシステムの
/root/websiteディレクトリに対応させます。
docker run -d -p 80:80 --name myapache -v /root/website/:/usr/local/apache2/htdocs/ httpd- テスト用Webページを作成します
mkdir website && cd website
vi index.html- 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>- スマホでブラウザを開き、
localhost:8081/index.htmlを入力すると、DockerのWebページが正常に表示されます。
3. まとめ#
仮想マシン+DockerでApache Serverを動かす程度なら、そこそこ使えそうです。ただしMinecraftサーバーのようなものを実行すると、性能低下はかなり目立ちます。
仮想化の層を省けるなら、dockerの性能は大幅に上がりますし、Alpine Linuxの起動に30秒待つ必要もありません。そのため、kernelを変更してdockerを動かすほうが性能はよくなります。
ついでに言うと、iOSにはAlpine LinuxベースのiSH Shellターミナルエミュレーターがあります。理論上は同じようにdockerを動かせるはずです。