Vyline DOCS

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が異常なケースの診断は詳細ガイドにあります。

ページ名・設定名・コマンドで検索