itsrda

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 df ile 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.

Not: Komutları üretim ortamında çalıştırmadan önce yedek alın ve önce test ortamında deneyin. Bir adım sizde farklı davranıyorsa bize yazın, rehberi güncelleyelim.