Android Docker Host
root済みarm64 Android上でDocker Engineを動かす構成です。一般的なAndroid対応を意味するものではなく、kernel・mount・storage・networkの条件を個別に確認します。
通常のLinuxサーバーより構築要件が多い方法です。Docker CLIだけではなく、container起動、外向き通信、published port、永続化まで確認してください。
最初から最後までの手順は「Android 詳細ガイド」にまとめています。 このページでは、端末がどのケースに当たるかを短く判定できます。
構成
Android arm64 device
├─ Android OS / vendor kernel
│ ├─ root (KernelSU / Magisk 等)
│ ├─ container向け kernel config
│ ├─ Android netd / policy routing
│ └─ SELinux
├─ Termux
│ ├─ BusyBox / SSH / tmux
│ └─ Ubuntu rootfs取得
├─ Ubuntu rootfs (real chroot)
│ ├─ Docker Engine / containerd / runc
│ └─ Compose
├─ ext4 loop image → /var/lib/docker
└─ containers
└─ vyline
optional:
Portainer / Tailscale / Cloudflare Tunnel 等
rootfsの取得にはproot-distroを使えますが、Docker Engineの実行はreal chrootで行います。Portainerや外部アクセス用ツールはVylineの動作要件ではありません。
Preflight
uname -m
id
getenforce
cat /proc/cgroups
mount | grep -E 'cgroup|cgroup2'
ls -l /dev/block/loop* 2>/dev/null
arm64とrootに加え、Dockerが使うnamespaces、cgroups、seccomp、OverlayFS、veth/bridge、netfilter、loop/ext4等を確認します。詳細はAndroid Kernel。
| ここで起きたこと | 進む場所 |
|---|---|
| dockerd自体が起動しない | Kernel とstorage/cgroupを確認 |
hello-worldは動くがInternetへ出られない | Networking |
Internetへ出るがLANから:3000へ入れない | published-port / nft・legacy経路を確認 |
| Dockerもnetworkも正常 | Vyline Composeへ進む |
Termux
pkg update -y
pkg install -y proot-distro busybox openssh tmux coreutils curl
termux-wake-lock
proot-distro install ubuntu
Ubuntu rootfsの標準例:
/data/data/com.termux/files/usr/var/lib/proot-distro/containers/ubuntu/rootfs
real chrootのmount
PREFIX=/data/data/com.termux/files/usr
ROOT="$PREFIX/var/lib/proot-distro/containers/ubuntu/rootfs"
BB="$PREFIX/bin/busybox"
su
$BB mount --bind "$ROOT" "$ROOT"
$BB mount --make-rslave "$ROOT"
$BB mount --rbind /dev "$ROOT/dev"
$BB mount --make-rslave "$ROOT/dev"
$BB mount -t proc proc "$ROOT/proc"
$BB mount --rbind /sys "$ROOT/sys"
$BB mount --make-rslave "$ROOT/sys"
$BB mount -t tmpfs -o mode=755,nosuid,nodev tmpfs "$ROOT/run"
rootfs自体をself-bindしてmountpoint化し、rslaveへするのはruncのrecursive mount操作を成立させるためです。これを省くと remount / ... invalid argument 系で失敗することがあります。
Docker data-rootはext4へ
まずAndroid側filesystem上でoverlay2が正常に使えるか試します。F2FS、casefold、vendor kernelの組み合わせによってEINVALになる端末だけ、ext4 loop imageへ/var/lib/dockerを逃がします。
stat -f -c '%T' /data
docker info 2>/dev/null | grep -E 'Storage Driver|Backing Filesystem'
mkdir -p /data/local/docker-storage
truncate -s 64G /data/local/docker-storage/docker-ext4.img
/system/bin/mke2fs -t ext4 -F /data/local/docker-storage/docker-ext4.img
LOOP=$(/system/bin/losetup -f)
/system/bin/losetup "$LOOP" /data/local/docker-storage/docker-ext4.img
$BB mount -t ext4 -o rw,noatime "$LOOP" "$ROOT/var/lib/docker"
chroot内のDocker
{
"storage-driver": "overlay2",
"exec-opts": ["native.cgroupdriver=cgroupfs"],
"log-driver": "local"
}
rm -f /var/run/docker.pid
nohup dockerd >/var/log/dockerd.log 2>&1 </dev/null &
docker run --rm hello-world
docker run --rm alpine uname -m
docker run --rm alpine ping -c 1 1.1.1.1
ネットワークは別問題
Dockerが動いてもAndroid netdのpolicy routingやlegacy iptablesとの不一致で、container→Internet、LAN→published portが壊れることがあります。切り分けは Android Network を参照してください。
Vyline Compose
services:
vyline:
image: ghcr.io/tqmane/vyline:latest
pull_policy: always
platform: linux/arm64
ports:
- "3000:3000"
volumes:
- /opt/vyline/data:/app/data
- /opt/vyline/storage:/app/storage
environment:
VYLINE_HOST: 0.0.0.0
PORT: 3000
VYLINE_DATA_DIR: /app/data
VYLINE_STORAGE_DIR: /app/storage
VYLINE_LAN_ACCESS: "false"
VYLINE_TRUST_REMOTE_OWNER: "false"
TZ: Asia/Tokyo
restart: unless-stopped
multi-arch imageなのでplatform: linux/arm64は通常省略できます。明示したい場合だけ残します。まず標準healthcheckを使い、host側HTTPでは正常なのにhealthcheck/exec経路だけ壊れるAndroid chrootでのみ次を追加します。
healthcheck:
disable: true
その場合もcurl http://127.0.0.1:3000/healthzでVyline本体が正常なことを確認してから無効化してください。docker execだけmount namespaceが異常なケースの診断は詳細ガイドにあります。