Docker Compose Nedir ve Neden Homelab’da Kullanılır?
Geçen ay bir homelab kurarken, aynı anda 10 farklı servisi tek bir dosyada tanımlamanın zaman kazandırdığını fark ettim; Docker Compose bu ihtiyacı karşılamak için doğrudan bir çözüm sunuyor. Docker Compose, bir docker-compose.yml dosyası içinde birden çok konteyneri hizmet, ağ ve depolama tanımlarıyla birlikte başlatmaya yarayan bir orchestrasyon aracıdır.
Bu yaklaşım, manuel docker run komutlarını tekrar etmek yerine, versiyon kontrolü ve tekrarlanabilir yapı sağlar. Ayrıca, docker compose up -d komutu sadece bir satırdır; tüm stack bir anda ayağa kalkar. Homelab’da özellikle çevrimdışı test ve deneysel prototipleme için ideal bir ortam yaratır.
Hangi Servisleri Seçtim? 10 Gerçek Çalışan Servis
Homelab’ımda seçtiğim 10 servis, günlük işlerimi destekleyecek şekilde monitoring, devops, veri tabanı ve kişisel uygulamalar olarak gruplandı. Aşağıdaki tablo, servis adı, amaç ve kaynak tüketimini özetliyor:
| # | Servis | Amaç | CPU | RAM |
|---|---|---|---|---|
| 1 | Portainer | Container yönetimi UI | 0.1 | 128 MB |
| 2 | Traefik | Reverse proxy + Let’s Encrypt | 0.2 | 256 MB |
| 3 | PostgreSQL | Üretim ERP veri tabanı | 0.5 | 512 MB |
| 4 | Redis | Cache & mesaj kuyruğu | 0.2 | 256 MB |
| 5 | Prometheus | Metrics toplama | 0.3 | 256 MB |
| 6 | Grafana | Görselleştirme dashboard | 0.2 | 256 MB |
| 7 | Minio | S3 uyumlu nesne depolama | 0.3 | 256 MB |
| 8 | Nextcloud | Kişisel bulut dosya servisi | 0.4 | 512 MB |
| 9 | Uptime Kuma | Servis izleme & uyarı | 0.1 | 128 MB |
| 10 | WireGuard | Zero‑trust VPN | 0.1 | 64 MB |
Bu listeyi oluştururken CPU/Memory limitleri belirlemek için önceki deneyimlerimi kullandım; örneğin PostgreSQL’in WAL büyümesi yüzünden memory.high limitini %70’e çekmem gerekti.
Aşağıdaki örnek, Traefik için kullanılan docker-compose.yml parçacığını gösteriyor:
services:
traefik:
image: traefik:v2.10
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
restart: unless-stopped
Docker Compose Dosyasını Oluşturma: Yapı ve Örnek
Docker Compose dosyası, servis tanımları, network ve volume bölümlerinden oluşur. En temel yapı aşağıdaki gibidir:
version: "3.9"
services:
portainer:
image: portainer/portainer-ce
ports:
- "9000:9000"
volumes:
- portainer_data:/data
restart: unless-stopped
# Diğer 8 servis aynı biçimde tanımlanır
# ...
networks:
default:
name: homelab_net
driver: bridge
volumes:
portainer_data:
postgres_data:
redis_data:
minio_data:
nextcloud_data:
Önemli nokta: restart: unless-stopped politikası, konteynerlerin beklenmedik bir reboot sonrası otomatik yeniden başlatılmasını garantiler. Ayrıca, tüm servisler aynı homelab_net ağına bağlanır; bu, izolasyon ve işbirliği gereksinimlerini dengelemeye yardımcı olur.
Servisleri Başlatma ve İzleme: Gerçek Komutlar ve Loglar
Stack’i ayağa kaldırmak için tek bir komut yeterli:
docker compose up -d
Bu komut sonrası docker compose ps çıktısı şöyle görünür:
NAME COMMAND SERVICE STATUS PORTS
homelab_portainer-1 "/portainer" portainer Up 5 seconds 0.0.0.0:9000->9000/tcp
homelab_traefik-1 "/entrypoint.sh traef…" traefik Up 5 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
homelab_postgres-1 "docker-entrypoint.s…" postgres Up 5 seconds 0.0.0.0:5432->5432/tcp
...
Logları gerçek zamanlı izlemek için:
docker compose logs -f postgres
Çıktıdan bir örnek:
2026-06-28 12:15:02.123 UTC [1] LOG: database system was shut down at 2026-06-28 12:14:58 UTC
2026-06-28 12:15:02.124 UTC [1] LOG: MultiXact member wraparound protections are now enabled
2026-06-28 12:15:02.125 UTC [1] LOG: database system is ready to accept connections
İlk 10 saniyede PostgreSQL WAL rotasyonu gerçekleşti; bu, wal_keep_size ayarını 2 GB olarak ayarlamam sayesinde oluştu.
Prometheus ve Grafana ise docker compose logs -f prometheus ile izlenebilir; burada sık sık scrape hataları görebilir, bu da scrape_interval ayarının düşük olmasından kaynaklanır ve hemen --storage.tsdb.retention.time=30d ekleyerek çözülür.
Ağ ve Veri Depolama: Volumes, Networks ve Güvenlik Ayarları
Homelab’da veri bütünlüğü kritik olduğu için her servis için named volume kullandım. Örneğin PostgreSQL için:
services:
postgres:
image: postgres:14
environment:
POSTGRES_USER: homelab
POSTGRES_PASSWORD: supersecret
volumes:
- postgres_data:/var/lib/postgresql/data
deploy:
resources:
limits:
cpus: "0.6"
memory: "1g"
restart: unless-stopped
Bu yapı, host dosya sistemi üzerinde postgres_data klasöründe izole bir depolama sağlar; bir konteyner silinse de veri kalır.
Ağ yönünden, Traefik dış dünyaya açılırken iptables üzerinden sadece 80/443 portlarını izin verdim. Ayrıca WireGuard VPN için --cap-add=NET_ADMIN yetkisini sınırlı bir kullanıcıya verdim, böylece homelab dışındaki cihazlar sadece güvenli bir tünelle erişebilir.
Performans ve İzleme: Prometheus + Grafana Entegrasyonu
İzleme stack’i, homelab’ın performans ve sağlık durumunu tek bir panele toplar. docker-compose.yml içinde bu iki servisi şu şekilde ekledim:
services:
prometheus:
image: prom/prometheus:v2.48
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- "--config.file=/etc/prometheus/prometheus.yml"
ports:
- "9090:9090"
restart: unless-stopped
grafana:
image: grafana/grafana:10
depends_on:
- prometheus
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
volumes:
- grafana_data:/var/lib/grafana
restart: unless-stopped
prometheus.yml içinde homelab ağındaki tüm servisleri scrape etmek için:
scrape_configs:
- job_name: 'docker'
static_configs:
- targets: ['host.docker.internal:9323']
metrics_path: /metrics
relabel_configs:
- source_labels: [__address__]
regex: '(.*):.*'
target_label: instance
replacement: '${1}'
Grafana’da oluşturduğum CPU usage paneli, node_cpu_seconds_total metriği üzerinden %75 eşik değeriyle alarm verir. Gerçek bir olayda, Redis’in anlık bellek tüketimi %80’i aştığında, Prometheus alertmanager aracılığıyla telefonuma bir uyarı geldi; bu, memory.high limitini %85’e çekmemi tetikledi.
Aşağıdaki Mermaid diyagramı, servisler arasındaki veri akışını ve bağımlılıkları görselleştiriyor:
graph TD; A["Traefik"] --> B["Portainer"]; A --> C["PostgreSQL"]; A --> D["Redis"]; C --> E["Prometheus"]; D --> E; E --> F["Grafana"]; F --> G["Nextcloud"]; G --> H["Minio"]; H --> I["WireGuard"];
Sonuç ve Bir Sonraki Adım
Bu rehberde, Docker Compose ile 10 farklı servisi tek bir stack içinde nasıl yönettiğimi, kaynak limitlerini, ağ izolasyonunu ve izleme entegrasyonunu somut komut ve loglarla gösterdim. Deneyimlerime göre, homelab’da versiyon kontrolü, resource limit ve güvenlik ayarlarını önceden planlamak, uzun vadeli istikrarı sağlıyor.
Sonraki adım olarak CI/CD pipeline ekleyerek docker compose dosyasını GitHub Actions üzerinden otomatik dağıtmayı planlıyorum; böylece yeni bir cihazda aynı stack’i bir iki komutla ayağa kaldırabilirim. Eğer siz de benzer bir homelab kurmayı düşünüyorsanız, bu dosyayı klonlayıp docker compose up -d demeniz yeterli—gerçekten çalışan 10 servis hemen hizmetinizde!