Raspberry Pi'de Docker ile Servis Çalıştırmak: Kurulum, Compose ve Tuzaklar
Raspberry Pi'ye Docker ve Compose kurmak, bir servisi konteyner olarak çalıştırmak, veriyi kalıcı tutmak, SD kartı korumak ve güvenlik duvarını atlayan port tuzağından kaçınmak için pratik rehber.
Docker, bir uygulamayı bağımlılıklarıyla birlikte yalıtılmış bir konteyner içinde çalıştırır. Raspberry Pi'de bu, bir servisi kurup silmenin ve sürüm değiştirmenin temiz bir yolu olabilir; ama her proje için gerekli değildir. Bu rehber nasıl kurulacağını, nasıl güvenle kullanılacağını ve ne zaman kullanmamanız gerektiğini anlatır.
Docker'a ne zaman ihtiyaç var?
Tek bir Flask uygulaması ve bir veritabanı çalıştırıyorsanız, systemd servisi ile sanal ortam çoğu zaman daha basit ve daha hafiftir (Flask systemd rehberi). Docker şu durumlarda anlamlıdır: birden çok bağımsız servis çalıştırıyorsunuz, hazır bir imajla (örneğin bir izleme paneli) hızlı kurulum istiyorsunuz, ya da bir yazılımı sistemden izole etmek istiyorsunuz. Pi 3'ün 1 GB belleği Docker için sınırdadır; Pi 4 ya da 5 daha rahattır.
Kurulum
Resmi betik yerine Docker'ın kendi deposundan kurmak daha denetlenebilirdir; ancak Raspberry Pi OS için resmi kurulum belgesi güncel adımları verir. Kurulumdan sonra kontrol edin:
docker --version
docker compose version
sudo docker run --rm hello-world
Kullanıcınızı docker grubuna eklemek (sudo usermod -aG docker $USER) her komutta sudo yazmayı önler; ancak docker grubuna sahip biri fiilen root yetkisine sahiptir, bu yüzden yalnızca güvendiğiniz kullanıcılara verin.
Compose ile örnek servis
Tek tek docker run komutları yerine bir compose.yaml dosyası, ayarlarınızı belgeler ve tekrarlanabilir kılar:
services:
panel:
image: ornek/uygulama:1.4
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
volumes:
- ./veri:/app/veri
environment:
- TZ=Europe/Istanbul
Çalıştırmak için docker compose up -d, günlük için docker compose logs -f, durdurmak için docker compose down. restart: unless-stopped Pi yeniden başladığında konteynerin geri gelmesini sağlar.
Dikkat: portlar güvenlik duvarını atlayabilir
Docker, yayınladığınız portlar için kendi güvenlik duvarı kurallarını yazar ve bunlar UFW kurallarını çoğu zaman devre dışı bırakır. ports: - "8080:8080" yazarsanız servis tüm ağ arabirimlerinden erişilebilir olur, UFW'de reddetmiş olsanız bile. Çözüm: yalnızca 127.0.0.1:8080:8080 biçiminde yayınlamak ve dışarıya tünel ya da ters vekil üzerinden açmak (Cloudflare Tunnel, UFW rehberi). Başka bir cihazdan nmap ile hangi portların gerçekten açık olduğunu doğrulayın.
Veriyi kalıcı tutmak
Konteyner silindiğinde içindeki veri de gider. Kalıcı olması gereken her şeyi birim (volume) ile ana makineye bağlayın ve o klasörü yedekleyin. Veritabanı gibi servislerde klasörü kopyalamak yerine mantıksal döküm almak daha güvenlidir (MariaDB yedek). Yedek planınızı konteyner dünyasında da uygulayın: imajlar yeniden indirilebilir, ama veri indirilemez.
SD kartı korumak
Docker, günlükleri ve katmanları SD karta yazar. Önlemler:
- Konteyner günlüklerinin boyutunu sınırlayın (
logging: driver: json-file, options: max-size: "10m", max-file: "3"). - Docker veri dizinini (
/var/lib/docker) USB SSD'ye taşıyın. - Kullanılmayan imajları temizleyin:
docker image prune -a,docker system dfile yer kullanımına bakın (disk doluluk tanılama). - SD kart ömrü için genel önlemler.
Güncelleme düzeni
İmaj etiketini latest bırakmak, bir gün beklenmedik bir sürüme geçmenize yol açar. Belirli bir sürüm etiketi kullanın, yeni sürümü önce deneyin, sonra docker compose pull && docker compose up -d çalıştırın. Güncellemeden önce volume klasörünün bir kopyasını alın ve sorun çıkarsa eski etikete dönün.
Kaynak tüketimi ve izleme
docker stats her konteynerin bellek ve işlemci kullanımını gösterir. Bellek yetmezse Pi swap'e düşer ve yavaşlar; sınır koymak için mem_limit kullanın. Bellek ve işlemci tanılaması için Linux kaynak tanılama yazısına bakın. Servislerin ayakta olduğunu izlemek için servis izleme ve alarm yaklaşımı konteynerlerde de geçerlidir (docker ps çıktısı ya da sağlık adresi).
Sık sorulan sorular
Docker, Pi'nin açılışında otomatik başlar mı? Evet, systemctl is-enabled docker ile doğrulayın.
ARM imajı gerekli mi? Evet; Pi'nin işlemci mimarisi ARM'dır. İmajın arm64 ya da armv7 desteği olmalı, aksi halde "exec format error" alırsınız.
Güvenli mi? Konteynerler izolasyon sağlar ama sanal makine kadar güçlü değildir. Güvenilmeyen imajlar çalıştırmayın, root olarak çalışmaktan kaçının ve imajları resmi kaynaklardan alın.