Gerçek dünya uygulamaları nadiren tek bir container’dan ibarettir: bir API sunucusu, bir veritabanı, belki bir Redis cache ve bir reverse proxy — hepsini ayrı ayrı docker run komutlarıyla yönetmek hızla karmaşıklaşır. Docker Compose, bu servisleri tek bir YAML dosyasında tanımlayıp tek komutla ayağa kaldırmanızı sağlar.

Docker Compose ile WordPress nasıl kurulur? (WordPress + MySQL örneği)

Bu portalın kendisinin de kurulumunda kullanılabilecek klasik bir örnek — WordPress ve veritabanını birlikte tanımlayan bir docker-compose.yml:

services:
  db:
    image: mariadb:10.11
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
      MYSQL_ROOT_PASSWORD: rootpass
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    restart: unless-stopped
    depends_on:
      - db
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:

Tüm stack’i ayağa kaldırmak tek bir komut:

docker compose up -d

Dosyanın anatomisi

  • services: Her biri kendi container’ında çalışacak parçaları tanımlar (db, wordpress).
  • depends_on: Başlatma sırasını belirtir — wordpress, db‘den sonra başlar (ama veritabanının hazır olduğunu garanti etmez, sadece container’ın başladığını).
  • environment: Container içine enjekte edilen ortam değişkenleri.
  • volumes: Container silinse bile verinin kalıcı olmasını sağlayan isimlendirilmiş diskler.
  • ports: Host makinenin portunu container’ın portuna eşler (host:container).

Servisler arası iletişim

Compose, aynı dosyada tanımlı servisler için otomatik olarak bir ağ (network) oluşturur. Bu sayede wordpress servisi, veritabanına localhost yerine doğrudan servis adıyla (db) ulaşabilir — Docker’ın dahili DNS çözümlemesi bunu otomatik halleder.

i

Ortam değişkenlerini ve parolaları doğrudan docker-compose.yml içine yazmak yerine, production’da bir .env dosyası veya Docker secrets kullanmak güvenlik açısından önerilir. Bu konuyu Güvenlik bölümünde detaylı işliyoruz.

Sık kullanılan komutlar

docker compose up -d          # servisleri arka planda başlat
docker compose ps             # çalışan servisleri listele
docker compose logs -f wordpress   # belirli bir servisin loglarını takip et
docker compose down           # servisleri durdur ve kaldır
docker compose down -v        # + isimlendirilmiş volume'leri de sil

Tek makinede birden fazla servisi yönetmeyi öğrendiğinize göre, artık bunu Podman gibi alternatiflerle veya çok makineli orkestrasyon araçlarıyla nasıl karşılaştıracağınıza bakabiliriz.