Docker na Raspberry Pi: ARM, Compose v2 i praktični stackovi

Instalacija Dockera i Compose v2 na Raspberry Pi-u. ARM arhitektura, pinnane image tagove i praktični stackovi bez zastarjelog docker-compose v1.

Docker Homelab Raspberry Pi Self-hosting
Docker na Raspberry Pi: ARM, Compose v2 i praktični stackovi

Docker na Raspberry Pi-u omogućuje pokretanje više servisa (web, DNS, monitoring, baze) u izoliranim kontejnerima bez sukoba ovisnosti na hostu. Za homelab i male SMB setupove to je često brži put od ručne instalacije svakog paketa, uz uvjet da birate slike koje postoje za ARM (arm64/aarch64 na Pi 4/5) i da pinate verzije.

Ako tek gradite kućni server, krenite od Raspberry Pi kao home server. Kad stack preraste „jedan kontejner“, produkcijska disciplina Composea je u Docker Compose u produkciji; za TLS i ulazni proxy na VPS-u vidi Traefik reverse proxy.

Što je Docker?

Docker pakira aplikaciju i ovisnosti u kontejner koji dijeli kernel s hostom. Lakši je od VM-a, brže se pokreće, a izolacija olakšava upgrade i rollback.

Zašto na Raspberry Pi-u

  • Izolacija: servisi ne dijele iste sistemske pakete
  • Ponovljivost: isti compose.yml na drugom Pi-u ili VPS-u
  • Više servisa: Nginx, Pi-hole, Portainer… bez ručnog sukoba porta i biblioteka
  • Manji footprint od potpunih virtualnih mašina

ARM napomena: nije svaka Docker Hub slika dostupna za linux/arm64 ili linux/arm/v7. Prije docker pull provjerite multi-arch / platform oznaku. Alpine i službene slike (nginx, mariadb, wordpress) obično imaju arm64; neke „amd64-only“ slike na Pi-u jednostavno neće raditi.

Instalacija Dockera

Ažurirajte sustav, zatim službena instalacijska skripta (instalira Docker Engine + Compose plugin v2):

sudo apt update
sudo apt upgrade -y

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

sudo usermod -aG docker $USER
sudo systemctl enable --now docker
newgrp docker

Compose v2 dolazi kao plugin: naredba je docker compose (razmak), ne stari apt paket docker-compose (crtica). Ne instalirajte v1 paket osim ako imate legacy razlog.

Provjera

docker --version
docker compose version
docker run --rm hello-world

Osnovne Docker naredbe

# Preuzimanje slike (pinnana verzija)
docker pull nginx:1.27-alpine

docker images
docker run -d -p 8080:80 --name moj-nginx nginx:1.27-alpine
docker ps
docker ps -a

docker stop moj-nginx
docker start moj-nginx
docker rm moj-nginx
docker rmi nginx:1.27-alpine

docker logs moj-nginx
docker exec -it moj-nginx /bin/sh

Primjer: Nginx web server

mkdir -p ~/my-website
cd ~/my-website
echo "<h1>Dobrodošli na moj Raspberry Pi!</h1>" > index.html

docker run -d \
  --name web-server \
  -p 8080:80 \
  -v ~/my-website:/usr/share/nginx/html:ro \
  --restart unless-stopped \
  nginx:1.27-alpine

Stranica: http://raspberrypi.local:8080 (ili IP Pi-a).

Docker Compose v2

Compose opisuje više servisa u jednoj YAML datoteci. Ključna riječ version: na vrhu datoteke više nije potrebna u Compose specifikaciji v2+; izostavite je.

Primjer: WordPress + MariaDB

Datoteka compose.yml:

services:
  db:
    image: mariadb:11.4
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: change-me-root
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: change-me-wp
    restart: unless-stopped

  wordpress:
    depends_on:
      - db
    image: wordpress:6.7-php8.2-apache
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: change-me-wp
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html
    restart: unless-stopped

volumes:
  db_data:
  wordpress_data:
docker compose up -d
docker compose ps
docker compose logs -f wordpress

Promijenite lozinke prije produkcije. Za restart policy, healthcheckove i tajne na VPS-u: Compose u produkciji.

Korisni kontejneri (ARM-friendly)

1. Pi-hole

docker run -d \
  --name pihole \
  -p 53:53/tcp -p 53:53/udp \
  -p 8081:80 \
  -e TZ="Europe/Zagreb" \
  -e WEBPASSWORD="jakalozinka" \
  -v pihole_data:/etc/pihole \
  -v dnsmasq_data:/etc/dnsmasq.d \
  --restart=unless-stopped \
  pihole/pihole:2024.07.0

Provjerite da port 53 nije zauzet drugim DNS-om na Pi-u. Tag ažurirajte prema Docker Hubu; pinajte verziju, ne :latest.

2. Portainer CE

docker run -d \
  -p 9000:9000 \
  --name portainer \
  --restart unless-stopped \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:2.21.4

3. Grafana

docker run -d \
  -p 3000:3000 \
  --name grafana \
  -v grafana_data:/var/lib/grafana \
  --restart unless-stopped \
  grafana/grafana:11.2.0

Održavanje

docker container prune
docker image prune
docker volume prune
docker system df

# oprezno: briše nekorištene slike
docker system prune -a
docker compose pull
docker compose up -d

Najbolje prakse na Pi-u

  • Pinajte tagove (nginx:1.27-alpine), ne :latest
  • Volume-i za podatke koji moraju preživjeti recreate kontejnera
  • restart: unless-stopped za 24/7 servise
  • ARM: testirajte pull prije nego što ovisite o slici u produkciji
  • SD vs SSD: I/O i trajnost bolji na USB SSD-u
  • RAM: Pi 4/5 s 4GB+ za više kontejnera; Pi 3 za 2–4 lagana servisa

Zaključak

Docker + Compose v2 pretvara Raspberry Pi u ponovljiv homelab host. Sljedeći koraci: kućni server setup, Compose disciplina na VPS-u, i reverse proxy kad servise izložite vani.

Ako trebate pomoć oko stacka na Pi-u ili VPS-u, DevOps usluge.

Česta pitanja

Može li Raspberry Pi 3 pokretati Docker?
Da, ali s manje RAM-a. Pi 4/5 s 4GB+ razumniji je za više kontejnera.

Hoće li Docker usporiti Pi?
Overhead je mali jer dijele kernel. Usko grlo obično je SD kartica i RAM, ne sam Docker.

Gdje su podaci?
Engine podaci u /var/lib/docker; trajni podaci aplikacija držite u named volumeima ili bind mountovima koje backupirate.