Ana SayfaBlogDocker Desktop'tan OrbStack'a Geçtim: Mac Mini M4'te 60 Gün Notları
Container & Orchestration

Docker Desktop'tan OrbStack'a Geçtim: Mac Mini M4'te 60 Gün Notları

Emre Ferit Aslantas15 Mayıs 202612 dkMakale
docker orbstack mac-mini-m4 apple-silicon kubernetes developer-tools
Sponsored

Docker Desktop'ı Mac'te yaklaşık dört yıldır kullanıyordum. M1'den M4'e geçtikten sonra performans tarafında rahatladım ama fan sesi, idle RAM tüketimi ve "VM kasıyor" hissiyatı birikiyordu. Bu yıl Mart sonunda OrbStack'i ciddi şekilde denemeye karar verdim ve son 60 günde tek günlük geliştirme makinem üzerinde production-benzeri iş yüklerini onunla çalıştırdım. Bu yazı, "OrbStack daha iyi mi?" sorusuna kişisel cevabımı veriyor — neyi kazandım, neyi kaybettim, hangi anlarda Docker Desktop'a dönmek istedim.

Karşılaştırma yaptığım host her zaman aynı: Mac Mini M4, 24 GB RAM, macOS 15.4. Docker Desktop tarafında 4.30.0, OrbStack tarafında 1.9.x sürümünü kullandım. Workload'larım: efa-agent (Python/FastAPI + LangGraph), Redis + ChromaDB stateful servisleri, lokal K8s cluster, ara sıra çalıştırdığım birkaç Postgres ve SearXNG image'ı.

İlk Saatler: Kurulum ve İlk İzlenim

OrbStack brew install orbstack ile geldi. Açtığım anda Docker Desktop'tan geriye dönmemek istedim — uygulama çalışırken menubar dışında bir pencere bile açmadı. Docker Desktop'ın "Dashboard"unu hiç sevmemiştim; arada bir whale ikonuna basıp hangi konteynerin niye yendiğini kontrol etmeye çalışmak başlı başına bir UX problemiydi.

Var olan konteynerleri taşımak için OrbStack'in Migrate from Docker Desktop butonu var. Bende 18 image (~7 GB) ve 6 volume (~2 GB) vardı. Migration 8-12 dakika civarında sürdü. İmaj-by-imaj kopyalama, volume snapshot'ları ve ~/.docker/config.json ayarlarını otomatik aldı. Sonrasında Docker Desktop'ı Troubleshoot → Reset to factory defaults ile temizledim ve uninstall ettim — yaklaşık 6 GB disk geri kazandım.

İlk şok: docker ps komutu anında dönüyordu. Docker Desktop'ta bu komutun 1-2 saniye sürmesine alışmıştım. OrbStack soketi unix domain üzerinden çok daha düşük gecikmeyle cevap veriyor — kolay ölçülecek bir fark değil ama ellerinizle hissediyorsunuz.

Kaynak Tüketimi: Gerçek Rakamlar

İlk 7 gün boyunca, hiçbir aktif konteyner yokken sadece daemon idle durumunda RAM ve CPU'yu Activity Monitor ve top üzerinden ölçtüm:

| Metrik | Docker Desktop | OrbStack | |---|---|---| | Idle RAM (host VM dahil) | ~2.6 GB | ~310 MB | | Soğuk başlatma süresi | ~28 sn | ~2-3 sn | | Idle CPU (8 çekirdek) | %2-4 sürekli | <%0.5 | | Disk image boyutu (ortalama) | ~9 GB sparse | ~5 GB sparse |

Idle RAM farkı benim için en büyük kazanım. 24 GB RAM'li bir makinede bunun tek başına problemi olmadığını söyleyenler için: aynı anda Chrome (8+ tab), VS Code, Claude Code, lokal LLM (MLX-Server, ~12 GB), Docker katmanı, K8s pod'ları derken Docker Desktop'la swap'a yaklaşırdım. OrbStack'a geçtikten sonra 60 günde sıfır kez swap'a girdiğimi belirteyim — vm_stat'tan kontrol ettim.

Build süresi tarafında, kendi Python image'ım için (FastAPI + birkaç ML kütüphanesi, ~1.2 GB) ölçtüğüm rakamlar:

# docker build --no-cache -t efa-agent:test .
Docker Desktop : 92-104 sn  (3 deneme ortalaması ~98 sn)
OrbStack       : 58-66 sn   (3 deneme ortalaması ~62 sn)

OrbStack'in daha hızlı oluşunun ana sebebi Apple Silicon native dosya sistemi entegrasyonu. Docker Desktop'taki gRPC-FUSE/VirtioFS katmanı dosya I/O üzerinde belirgin bir vergi koyuyor. pip install ve npm install gibi binlerce küçük dosya yazan adımlar gözle görülür şekilde hızlanıyor.

K8s Entegrasyonu: En Büyük Sürpriz

Docker Desktop'ın "Enable Kubernetes" tikini açtığınızda gelen K8s, benim için her zaman bir şeyleri ilk denemek için yeterliydi ama "real" gelmiyordu — control plane'in restart süresi, image pull davranışı, networking quirk'leri vardı. Apple Silicon homelab'ımdaki ai-lab namespace'i Docker Desktop K8s üzerinde aylarca koştu, sorunlar olduğunda her seferinde "ah evet Docker Desktop K8s yine" diyordum.

OrbStack'in K8s'i farklı bir hikaye. Açma süresi ~6 saniye. Pod'lar host networking'le sanki localhost'taymış gibi davranıyor. En önemlisi: host.docker.internal yerine artık istediğim adı veriyorum — OrbStack *.k8s.orb.local altında otomatik DNS sağlıyor. Mac Mini M4 homelab yazımda anlattığım ExternalName numarası burada hala işe yarıyor ama artık çıplak Service tanımıyla da host'a erişebiliyorum:

apiVersion: v1
kind: Service
metadata:
  name: mlx-server
  namespace: ai-lab
spec:
  type: ExternalName
  externalName: host.orb.internal
  ports:
    - port: 8000
      targetPort: 8000

host.orb.internal host adresini Docker Desktop'taki host.docker.internal ile fonksiyonel olarak eşdeğer; ama OrbStack tarafında ilk denemede çalıştı. Docker Desktop'ta benzer kurulumu yaparken bir yan ayar (Use VirtioFS veya Allow privileged port mapping) yüzünden iki saatimi yakmıştım.

Multi-cluster Yan Etkisi

OrbStack tek tıkla birden fazla K8s cluster açmana izin veriyor. Ben ai-lab (development) ve staging (production benzeri) olarak ikiye böldüm. Toplam ek RAM maliyeti ~600 MB. Docker Desktop'ta multi-cluster için minikube/k3d ile uğraşıyor olurdum.

60 Günde Karşılaştığım Üç Tuzak

OrbStack pazarlama materyalleri kadar pürüzsüz değil. Yaşadıklarım:

1. Volume Permission Bug — İki Saat Yedim

Postgres image'ı çalıştırdığımda volume üzerinde chown hatası alıyordum. Logs:

chown: /var/lib/postgresql/data: Operation not permitted

Aynı compose.yaml Docker Desktop'ta sorunsuz çalışıyordu. Sebep: OrbStack'in macOS dosya sistemini konteynere mount ederken kullandığı uid mapping varsayılanları farklı. Çözüm compose.yaml'a user: "999:999" eklemek ve bind mount yerine named volume kullanmaktı:

services:
  postgres:
    image: postgres:16
    user: "999:999"
    environment:
      POSTGRES_PASSWORD: dev
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

Bu detayı OrbStack docs'unda buldum ama Stack Overflow'a iki tab açmıştım. Migration sonrasında kontrol etmeniz gereken ilk konu Postgres/MySQL/MariaDB gibi uid'i sabit isteyen image'lar.

2. Buildx ve Cross-platform Build

Mac M4'te linux/amd64 image build ederken Docker Desktop'ta QEMU emülasyonu yavaş ama stabildi. OrbStack'te aynı build 3-4 kez crash etti. Sebep tam belli değil ama issue tracker'da benzer raporlar var. Çözüm: production amd64 build'lerimi artık GitHub Actions'a (ubuntu-latest runner) taşıdım. Bu zaten yapmam gereken bir şeydi; OrbStack beni doğru yola itti diyebilirim.

3. Logs Tail Buffer Problemi

docker logs -f ile uzun süre çalışan bir konteyneri takip ederken (8+ saat), OrbStack'in log buffer'ı zaman zaman saniyelik gecikmeler yaşıyor — Docker Desktop'ta hiç dikkatimi çekmemiş bir davranış. Çözüm: kritik servislerin logs'larını Loki'ye gönderiyorum, yerel docker logs'a güvenmiyorum. Bu da zaten doğru pratikti.

Kısmen Başarısız Olduğum Yer: GPU Pass-through

OrbStack'in "Metal GPU support for containers" özelliği duyurulduğunda heyecanlandım. Lokal LLM inference'ı (homelab yazımda anlattığım gibi) host üzerinde MLX ile çalıştırıyordum; konteyner içine alabilirsem K8s deployment'larım daha temiz olurdu. Üç akşam denedim:

orb run --gpu nvidia/cuda:12.0-base nvidia-smi   # Apple Silicon'da çalışmaz
orb run --gpu metal alpine:latest                # flag yok

Resmi destek hâlâ Linux containers'tan Metal'e doğru direkt değil. Workaround olarak Vulkan üzerinden bir şeyler denedim ama Llama.cpp Vulkan build'inin Apple Silicon Metal sürümünden ~%40 yavaş olduğunu gördüm. Sonunda vazgeçtim — MLX-Server hâlâ host'ta çalışıyor, K8s servisleri ExternalName ile bağlanıyor. OrbStack tek başına bu problemi çözmüyor; bu Apple Silicon ekosisteminin daha derin bir problemi.

DNS ve .local Otomatik Çözümleme

OrbStack'in en sevdiğim bonus özelliği: çalışan her konteyner için otomatik DNS kaydı. Bir Postgres'i postgres-dev adıyla çalıştırdığımda, host'tan postgres-dev.orb.local ile erişebiliyorum. Bunu compose dosyalarımdaki dev URL'lerini sadeleştirmek için kullanıyorum:

# .env.development
DATABASE_URL=postgresql://app:dev@postgres-dev.orb.local:5432/efa
REDIS_URL=redis://redis-dev.orb.local:6379

Bu küçük detay, localhost:5432 çakışmalarını (aynı anda iki Postgres çalıştırmak) tarihe gönderdi.

Lisans ve Kurumsal Kullanım

Docker Desktop'ın 250+ çalışanlı şirketlerde paralı olduğu hatırlatması artık tanıdık. OrbStack'in lisans modeli: kişisel/açık kaynak/eğitim ücretsiz, kurumsal kullanım $8/ay/kullanıcı civarı. Tek başıma çalışan biri olarak ücretsiz; iş ortamında bir gün karar verirsem fiyat Docker Desktop Business ($21/ay) ile karşılaştırılabilir. Önemli: lisans bir aracın teknik üstünlüğünü tek başına belirlemez ama Docker Desktop'tan kaçanlar için OrbStack'in lisans modeli daha şeffaf.

60 Gün Sonra Notlarım

  • Geri dönmüyorum. Idle RAM ve build süresi farkları benim için kalıcı bir kazanım. M4'ün fanı OrbStack'te şu ana kadar bir kez bile devreye girmedi; Docker Desktop'ta haftada en az bir kez duyardım.
  • K8s tarafı asıl sürpriz. "Sadece daha hafif bir Docker Desktop" sandığım ürün, K8s lokal geliştirme deneyimini gerçekten iyileştirdi. Cluster start süresi 4-5× daha hızlı.
  • Üç tuzağı bilerek başlayın. Volume permission, cross-platform build crash'leri ve log buffer davranışı — bu üçünü migration sonrası ilk hafta içinde mutlaka kontrol edin.
  • GPU/Metal pass-through hala yok. Yerel LLM/ML iş yükleri için host-native çalıştırmaya hazır olun.
  • Production build'ler bulutta. Lokal cross-platform build'leri OrbStack ile sınamak yerine CI/CD pipeline'a taşımak doğru tercih oldu. Geliştirme ortamınızın production'a ne kadar benzediği değil, production'ı temsil eden tek doğruluk kaynağınızın ne olduğu önemli.

OrbStack'i Mac geliştiriciler için artık varsayılan önerim. Ama bir aracın "daha iyi" olması, eski aracın "kötü" olduğu anlamına gelmiyor — Docker Desktop dört yıl boyunca işime yaradı, sadece 2026 itibarıyla benim ihtiyaçlarımı en iyi karşılayan o değil. Önümüzdeki yıl OrbStack de yerini bir başka şeye bırakabilir; geliştirici aletleri böyle hızlı dönüyor. Asıl önemli olan, aletin sizi yavaşlattığı anı fark edip değiştirme cesaretini gösterebilmek.

Bir sonraki yazıda muhtemelen lokal K8s üzerinde GitOps deneyimimi anlatacağım. OrbStack'le birlikte ArgoCD'yi nasıl set ettim, hangi sertifika dramalarıyla karşılaştım — uzun hikaye, ayrı bir yazıya yetecek.

Sponsored

Haftalık DevOps Bülteni

Yeni tool incelemeleri, karşılaştırmalar ve DevOps trendleri haftada bir kutuna gelsin.