Bir gün atıl kalan eski bir MacBook’a baktım ve şunu düşündüm: “Bu makine hâlâ çalışıyor, neden boşta beklesin?” İşte o andan itibaren başlayan ve beni beklenmedik bir öğrenme yolculuğuna sürükleyen süreç, bu yazının konusu.
Başlangıç: Eski Donanım, Yeni Ufuklar
2017 model bir MacBook Pro ile yola çıktım. Intel işlemci, 8 GB RAM, macOS Ventura. İlk engel hemen karşıma çıktı: güncel Docker Desktop artık bu donanımı desteklemiyordu.
Ama her kısıtlama yeni bir çözümü beraberinde getirir.
Çözüm: Colima + MacPorts
MacPorts ile Docker araçlarını kurdum, Docker Desktop’ın yaptığı işi ise Colima üstlendi. Colima, arka planda hafif bir Linux VM çalıştırarak Docker daemon’u ayağa kaldırıyor. Sonuç? Docker Desktop olmadan tam işlevsel bir Docker ortamı.
Kurulum mantığım netti:
- brew → sadece GUI uygulamalar
- MacPorts → CLI araçları ve servisler
Bu ayrım, sistemi düzenli tutmanın en kolay yolu oldu.
Portainer: Docker’ı Görselleştirmek
Terminal komutlarıyla container yönetmek başlangıçta karmaşık gelebilir. Portainer bu sorunu çözdü — Docker’ın üstünde çalışan, tarayıcıdan erişilen bir yönetim arayüzü.
Container başlatmak, durdurmak, log görmek, volume yönetmek… Hepsi birkaç tıkla. Üstelik Portainer’ın kendisi de bir Docker container’ı olarak çalışıyor.
Öğrenilen Kritik Kavramlar
Container vs Stack: Tek başına çalışan servisler için container yeterli. Birden fazla servisi birlikte çalıştırman gerekiyorsa — örneğin bir uygulama + veritabanı + cache — Stack kullanmak gerekiyor. Stack’ler docker-compose.yml mantığıyla çalışıyor.
Restart Policy: Her container’ı Always restart politikasıyla kurmak, sistemi yeniden başlattığında her şeyin otomatik ayağa kalkmasını sağlıyor. Bunu öğrenmeden önce her seferinde container’ları tek tek başlatmak zorunda kaldım.
Volume vs Bind Mount: Container silindiğinde veriler de gidebilir. Verinin kalıcı olması için ya named volume ya da host’taki bir klasörü bağlamak (bind mount) şart.
Hazır Şablonlar: Hızlı Kurulumun Gücü
Portainer’ın App Templates özelliği, popüler uygulamaları form doldurup “Deploy” diyerek kurmaya yarıyor. Topluluk tarafından hazırlanmış şablon listeleri ekleyince yüzlerce uygulama tek tıkla erişilebilir hale geliyor.
Elbette dikkatli olmak gerekiyor: şablonlar resmi değil. Port ayarlarını, volume path’lerini kendi sistemine göre düzenlemek şart.
Tek Dizin Felsefesi: Her Şey Bir Arada
Birkaç container kurduktan sonra kaos başladı. Config dosyaları nerede? Veriler nerede?
Çözüm basitti: tek bir dizin altında her şeyi toplamak.
~/Documents/docker/
├── jellyfin/
│ ├── config/
│ └── media/
├── navidrome/
│ ├── config/
│ └── music/
├── kavita/
│ ├── config/
│ └── books/
└── nextcloud/
├── config/
└── data/
Bu yapı sayesinde:
- Finder’dan kolayca erişebiliyorum
- Yedek almak tek komut
- Hangi verinin nerede olduğunu biliyorum
Her servis kendi klasöründe, config ve data ayrı. Basit ama etkili.
Tailscale: Kendi Özel Ağın
Evdeki tüm servislere dışarıdan güvenle erişmek istiyordum. Port açmak istemiyordum, statik IP yoktu. Tailscale her şeyi çözdü.
Tailscale, cihazların arasında şifreli bir VPN ağı oluşturuyor. MacBook, iPhone, iPad, başka bilgisayar — hepsi sanki aynı ağdaymış gibi birbirine bağlanıyor.
MagicDNS özelliğiyle IP adresi ezberlemek de tarihe karıştı. http://macbook.tailnet.ts.net:8096 gibi anlamlı adreslerle tüm servislere ulaşabiliyorum.
Tailscale’in güzelliği: kurulum beş dakika, sonrasında sıfır bakım.
Neler Kurdum: Kendi Ekosistemim
Bu süreçte kurduğum servislerin bir kısmı:
Medya
- Jellyfin → kişisel Netflix, video ve müzik
- Navidrome → müzik sunucusu, iOS uygulamasıyla offline dinleme
- Kavita → e-kitap okuyucu, EPUB ve PDF desteği
Üretkenlik
- FreshRSS → RSS okuyucu, içerik takibi
- Linkding → bookmark yöneticisi
- Memos → hızlı not alma
- Nextcloud → kişisel bulut depolama
Araçlar
- Stirling PDF → PDF düzenleme
- MeTube → YouTube indirici
- LibreTranslate → çeviri servisi
- SearXNG → gizlilik odaklı arama motoru
Dashboard
- Homepage → tüm servislerin tek ekranda görüntülendiği başlangıç sayfası
Her şey kendi container’ında, birbirinden izole, tek bir arayüzden yönetilebilir.
Geliştirme Ortamı: Docker ile Kod Yazmak
Docker sadece hazır uygulamalar için değil, kendi projelerini geliştirmek için de ideal.
PHP + SQLite ile basit bir web uygulaması geliştirmek için yaptığım şey şuydu:
services:
proje:
image: php:8.2-apache
ports:
- 8085:80
volumes:
- /Users/kullanici/Documents/www/proje:/var/www/html
Bind mount sayesinde Mac’te kod editöründe dosyayı kaydettiğimde, tarayıcıyı yenilediğimde değişiklik anında görünüyor. Yeniden build gerekmez, container’ı restart etmek gerekmez.
Birden fazla proje? Her biri farklı portta, birbirinden tamamen izole. PHP 8.2 kullanan bir proje, Python kullanan başka bir proje — hiç çakışma yok.
Cron işleri için de container içine cron daemon kurarak kalıcı zamanlama işleri tanımladım. Container yeniden başlasa bile cron konfigürasyonu Dockerfile’da olduğu için kaybolmuyor.
Cloudflare Tunnel: Dışarıya Açılmak
Tailscale ile kişisel erişim çözüldü. Peki ya projeleri dünyaya açmak?
Cloudflare Tunnel burada devreye girdi. Router ayarı yok, port açma yok, statik IP yok. Sadece bir Docker container çalıştırıyorsun ve Cloudflare kendi altyapısı üzerinden trafiği yönlendiriyor.
Kullanıcı → Cloudflare CDN → Tunnel → MacBook → Docker Container
Üstelik HTTPS otomatik geliyor. Sertifika yönetimi, SSL kurulumu — bunların hiçbiriyle uğraşmak yok.
Tek bir Cloudflare Tunnel container’ı ile birden fazla domain ve subdomain yönetilebiliyor. Yeni bir proje için sadece Cloudflare panelinden yeni bir “Public Hostname” ekliyorsun.
Zero Trust ile Güvenlik Katmanı
Cloudflare Zero Trust, servislerin önüne bir kimlik doğrulama katmanı ekliyor. Google hesabıyla giriş zorunluluğu, IP kısıtlamaları, oturum süreleri…
Bir test sitesini herkese açık tutmak yerine sadece belirli kişilerin erişebileceği şekilde kilitlemek birkaç tıkla mümkün. Şirket VPN’lerine alternatif, ev kullanıcısı için ise ekstra bir güvenlik kalkanı.
Öğrendiklerim
Bu yolculukta teknik bilginin ötesinde bazı temel prensipler oturdu kafamda:
Organizasyon her şeydir. İlk başta gelişigüzel kurulan container’lar zamanla kaosa döndü. Tek dizin, tutarlı isimlendirme ve her servis için ayrı klasör — bunlar sonradan düzeltilmesi zor alışkanlıklar.
Basit başla, karmaşıklaştırma. Her şeyi bir anda kurmaya çalışmak yerine bir servisi tam anlamıyla anlamak, sonrakini daha hızlı kurmayı sağladı.
Log okumayı öğren. Bir şey çalışmadığında docker logs container_adı komutu her zaman cevabı veriyor. Hata mesajını okumak, çözümün yarısı.
Yedek alma alışkanlığı edin. Tüm config ve data tek bir dizinde olduğunda yedek almak tek komut: klasörü kopyala, bitti.
Sonuç
Atıl bir MacBook, artık 7/24 çalışan kişisel bir sunucu. Medya sunucusu, müzik akışı, not alma, RSS okuyucu, kişisel bulut, geliştirme ortamı — hepsi tek bir makinede, tek bir ekosistemde.
Docker öğrenmek başlangıçta göz korkutucu görünüyor. Container nedir, image nedir, volume nedir… Ama bir kez oturunca, hiçbir şeyi eski yönteme dönüp kurmak istemiyorsun.
Eski bir MacBook varsa ve Docker merakın varsa: hemen başla. En kötü ihtimalle yeni bir şey öğrenirsin.