Best Docker Images for Raspberry Pi
A curated list of the best Docker images that run on Raspberry Pi. Covers media servers, ad blockers, dashboards, and more — all ARM-compatible.
Introduction
Docker unlocks powerful services on Raspberry Pi—from ad blocking to file sync to monitoring. This guide covers 10+ production-tested images optimized for ARM architecture, with real command examples and resource usage. Each is verified to run on Pi 4 and Pi 5 without excessive memory or CPU drain.
Prerequisites
- Raspberry Pi 4 (2GB+ RAM) or Pi 5 recommended
- 32GB+ microSD or USB SSD (SSD strongly preferred for heavy workloads)
- Docker installed:
curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER(add user to docker group)
Networking & DNS
Pi-hole (Ad Blocker + DHCP)
Blocks ads and trackers at network level. Replaces your router's DNS.
docker run -d \
--name pihole \
-p 53:53/tcp -p 53:53/udp \
-p 80:80 \
-e TZ=UTC \
-e WEBPASSWORD=yourpassword \
-v pihole_config:/etc/pihole \
--restart=unless-stopped \
pihole/pihole:latest
RAM usage: ~60 MB
Access: http://pi-ip/admin (default user: admin)
Notes: Requires port 53 for DNS. Set router's DHCP DNS to your Pi's IP.
WireGuard (VPN)
Lightweight VPN for secure remote access to your homelab.
docker run -d \
--name wireguard \
-p 51820:51820/udp \
-e PUID=1000 \
-e PGID=1000 \
-v wireguard_config:/config \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--restart=unless-stopped \
linuxserver/wireguard:latest
RAM usage: ~5 MB
Config location: /docker/wireguard_config/wg_confs (extract QR codes from here)
Traefik (Reverse Proxy)
Single entry point for multiple services with auto-HTTPS.
docker run -d \
--name traefik \
-p 80:80 \
-p 443:443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v traefik_config:/etc/traefik \
--restart=unless-stopped \
traefik:v2.11
RAM usage: ~40 MB
Use with: Docker labels on other containers for auto-routing
Media & File Sync
Jellyfin (Media Server)
Self-hosted Netflix alternative. Stream films, shows, music from your Pi.
docker run -d \
--name jellyfin \
-p 8096:8096 \
-e TZ=UTC \
-v jellyfin_config:/config \
-v jellyfin_cache:/cache \
-v /media/films:/media/films:ro \
--restart=unless-stopped \
jellyfin/jellyfin:latest
RAM usage: ~180 MB (idle), ~400 MB (streaming)
Transcoding: Hardware acceleration available on Pi 4/5 via /dev/video10
Access: http://pi-ip:8096
Nextcloud (File Sync & Collaboration)
Personal cloud storage with sync clients, calendar, contacts.
docker run -d \
--name nextcloud \
-p 8080:80 \
-e NEXTCLOUD_ADMIN_USER=admin \
-e NEXTCLOUD_ADMIN_PASSWORD=changeme \
-v nextcloud_data:/var/www/html \
--restart=unless-stopped \
nextcloud:27-apache
RAM usage: ~150 MB
Database: Use SQLite for single-Pi or MariaDB for production
SSD required: Heavy disk I/O during syncs
Productivity & Password Management
Vaultwarden (Bitwarden Server)
Self-hosted password manager. Lighter than full Bitwarden.
docker run -d \
--name vaultwarden \
-p 8000:80 \
-e DOMAIN=https://vault.example.com \
-e SIGNUPS_ALLOWED=false \
-v vaultwarden_data:/data \
--restart=unless-stopped \
vaultwarden/server:latest
RAM usage: ~80 MB
Data: SQLite file stored in /data volume
Monitoring & System Health
Uptime Kuma (Status Page & Monitoring)
Monitor websites and services, public status page.
docker run -d \
--name uptime-kuma \
-p 3001:3001 \
-v kuma_data:/app/data \
--restart=unless-stopped \
louislam/uptime-kuma:1
RAM usage: ~80 MB
Access: http://pi-ip:3001
Netdata (System Metrics)
Real-time CPU, RAM, disk, network monitoring dashboard.
docker run -d \
--name netdata \
-p 19999:19999 \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /etc/os-release:/etc/os-release:ro \
--cap-add=SYS_PTRACE \
--security-opt apparmor=unconfined \
--restart=unless-stopped \
netdata/netdata:latest
RAM usage: ~70 MB
Access: http://pi-ip:19999
Development & Version Control
Gitea (Git Server)
Self-hosted GitHub alternative. Minimal resource footprint.
docker run -d \
--name gitea \
-p 3000:3000 \
-p 222:22 \
-v gitea_data:/data \
-e DB_TYPE=sqlite3 \
--restart=unless-stopped \
gitea/gitea:latest
RAM usage: ~100 MB
Access: http://pi-ip:3000
SSH: Change port 22 to 222 for external access
Portainer (Docker Management UI)
Web UI for managing containers, images, volumes.
docker run -d \
--name portainer \
-p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--restart=unless-stopped \
portainer/portainer-ce:latest
RAM usage: ~60 MB
Access: http://pi-ip:9000
Quick Comparison Table
| Service | Purpose | RAM | ARM Support | Docker Hub |
|---|---|---|---|---|
| Pi-hole | DNS/Ad Block | 60 MB | Native ARM | pihole/pihole |
| WireGuard | VPN | 5 MB | Native ARM | linuxserver/wireguard |
| Traefik | Reverse Proxy | 40 MB | Multi-arch | traefik |
| Jellyfin | Media Server | 180-400 MB | Native ARM | jellyfin/jellyfin |
| Nextcloud | File Sync | 150 MB | Multi-arch | nextcloud |
| Vaultwarden | Password Manager | 80 MB | Native ARM | vaultwarden/server |
| Uptime Kuma | Monitoring | 80 MB | Multi-arch | louislam/uptime-kuma |
| Netdata | System Metrics | 70 MB | Multi-arch | netdata/netdata |
| Gitea | Git Server | 100 MB | Native ARM | gitea/gitea |
| Portainer | Container UI | 60 MB | Multi-arch | portainer/portainer-ce |
Troubleshooting
Image won't start on Pi
Check architecture compatibility: docker inspect linuxserver/wireguard | grep -i arch. Should show arm or arm64v8.
Out of memory
Use docker stats to monitor RAM per container. Reduce --memory limits or consider removing heavy services (Nextcloud, Jellyfin with transcoding).
Port already in use
Kill conflicting container: docker ps | grep :80 then docker kill <name> or change port mapping (-p 8080:80 instead of -p 80:80).
Summary
Run these images in Docker Compose stacks for cleaner management. Prioritize SSD storage—Pi-hole and Gitea are lightweight and ideal for learning, while Jellyfin with transcoding and Nextcloud heavy-sync demand better I/O. Start small, monitor with Netdata, and scale up your homelab one service at a time.