Linux containers on Android.
No root required.

Podroid spins up a real Alpine Linux VM using QEMU and a custom kernel.
You get a full Podman container runtime and a polished terminal.
Install the APK, tap Start, run containers.

Download APK View on GitHub

ARM64 · Android 9+ · No root · GPLv2

Everything a dev environment should have

Built from the kernel up for containers, not just shell access.

Rootless Podman

Full Docker-compatible container runtime. Pull from Docker Hub, run images, manage networks — all without root or custom kernel modules on the host.

Custom Linux 6.6 Kernel

Compiled from scratch with netfilter, bridge, overlayfs, veth, and cgroup v2 built-in. Every feature Podman needs is already there — no module loading.

Real Terminal

Termux TerminalView with xterm-256color, proper PTY, full mouse support, 114 color themes, 13 fonts, and an extra-keys bar with F1–F12, ESC, CTRL, ALT.

Port Forwarding

Expose any VM port to your Android device at runtime via QMP control. Run a web server, database, or API and hit it from your phone's browser.

Built-in SSH

Dropbear SSH server on port 9922 (configurable). Connect from your laptop, VS Code Remote, or any SSH client on the same network.

Persistent & Fast

Overlayfs over a persistent ext4 image. Containers, packages, and configs survive reboots. ZRAM swap gives 2× effective RAM. Boots in 6–15 seconds.

How Podroid stacks up

Termux gives you a Linux shell. Google Terminal gives you a VM with optional manual container setup. Podroid ships a full container runtime out of the box.

Capability
Podroid this project
Termux v0.118+
Google Terminal AVF
Root required ✓ No ✓ No ✓ No
Real container runtime ✓ Podman manual setup
VM isolation ✓ QEMU ✗ shared kernel ✓ AVF
Docker Hub images manual setup
Custom kernel ✓ Linux 6.6.87 ✗ host kernel
Works on any ARM64 ✓ Android 9+ ✗ Pixel only
Port forwarding ✓ via QMP via socat
Downloads folder sharing ✓ virtio-9p
SSH server ✓ Dropbear via pkg manual setup
xterm-256color + mouse basic
Configurable RAM / CPUs ✓ 512MB–4GB, 1–8 cores limited

How it works

Three channels, one VM, zero root. Here's what happens when you tap Start.

┌────────────────────── Android App (Compose) ─────────────────────────┐ │ │ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ │ PodroidService │ │ QEMU 11 TCG │ │ Terminal UI │ │ │ │ (ForegroundSvc) │ │ ARM64-native │ │ Termux View │ │ │ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │ └───────────┼─────────────────────┼─────────────────────┼──────────────┘ │ │ │ │ ┌─────────────────▼────────────────┐ │ │ │ Alpine Linux 3.23 VM │ │ │ │ ┌──────────┐ ┌──────────────┐ │ │ │ │ │ Podman │ │ Linux 6.6 │ │ │ └──►│ │(rootless)│ │ (custom) │ │◄───┘ boot stages │ └──────────┘ └──────────────┘ │ libpodroid-bridge.so │ │ PTY ↔ virtio-console └──────────────────────────────────┘ terminal.sock ↔ hvc0 → primary shell I/O ctrl.sock ↔ hvc1 → debounced SIGWINCH resize signals serial.sock ↔ ttyAMA0 → boot log stream → boot stage detection qmp.sock → runtime port-forward control
1

QEMU loads the kernel

Custom Linux 6.6.87 + initramfs extracted from APK assets on first launch.

2

Phase 1: storage mount

Init mounts storage.img as overlayfs for persistent container data.

3

Phase 2: services start

Networking (SLIRP + MASQUERADE), cgroup v2, Podman runtime, and Dropbear SSH come up.

4

Bridge connects

libpodroid-bridge.so relays your PTY to the VM's virtio-console. Shell is ready.

Running in under a minute

No configuration needed. Download, install, go.

1

Download the latest APK from the Releases page.

2

Install it on your Android device (ARM64, Android 9+).

3

Tap Start VM. Watch the boot progress — typically ready in 6–15 seconds.

4

Tap Open Terminal to access the Alpine shell.

5

Run containers. Any image from Docker Hub works out of the box.

# hello world # podman run --rm alpine echo hello # interactive shell # podman run --rm -it ubuntu bash # nginx on port 8080 # podman run -d -p 8080:80 nginx # list running containers # podman ps -a # SSH in from your laptop $ ssh root@<phone-ip> -p 9922

Common questions

If something isn't covered here, open an issue on GitHub.

Does this require root or a modified Android?
No. Podroid runs entirely in userspace using QEMU's TCG (software emulation). No root, no custom recovery, no Magisk. Any stock Android 9+ ARM64 device works.
Why not just use Termux + proot?
Termux is great for a Linux shell, but it runs on Android's host kernel. That kernel doesn't have the namespaces, cgroups, or netfilter rules needed for real containers. proot is a chroot emulation — containers built for Docker/Podman won't work reliably. Podroid runs a real VM with its own kernel purpose-built for Podman, so every OCI image from Docker Hub just works.
How is this different from Google Terminal / AVF?
Google's Terminal app uses Android Virtualization Framework (AVF) — a system-level hypervisor available on recent Pixel devices. It gives you a Debian VM but no container runtime and limited configurability. Podroid uses QEMU TCG (software emulation), which means it works on any ARM64 Android 9+ device — not just Pixels — and ships with a full Podman runtime, port forwarding, SSH, and a configurable terminal.
Is performance usable? QEMU is slow.
TCG is software emulation, so compute-heavy workloads are slower than native. However, Podroid ships several optimizations: a 256–512 MB translation cache, a dedicated I/O thread for virtio-blk (big win for image pulls), ZRAM swap for 2× effective RAM, and mitigations=off in the guest kernel for a 5–15% CPU gain. For typical dev tasks — running a web server, a database, CLI tools — it's very usable.
Can I access my Android files from the VM?
Yes. The Android Downloads folder is mounted into the VM via virtio-9p. Files you drop in Downloads are accessible inside the guest immediately.
How much storage does it use?
The APK is ~200 MB (QEMU + kernel + initramfs + fonts). On first launch you choose a VM disk size between 2 GB and 64 GB — this is a sparse storage.img that only grows as you pull images and install packages.
Can I connect from my laptop over SSH?
Yes. Dropbear SSH runs on port 9922 by default (configurable in Settings). As long as your laptop and phone are on the same network, ssh root@<phone-ip> -p 9922 gives you a remote shell — useful for VS Code Remote or any SSH client.