What is Docker Compose?

 Docker Compose, birden fazla container’dan oluşan uygulamaları tek bir dosya ile tanımlayıp, tek komutla çalıştırmanı sağlayan Docker aracıdır. Kısaca, Docker Compose = Multi-container uygulamaları YAML dosyasıyla yönetme aracıdır.

Örneğin, aşağıdaki yapının hepsini tek seferde ayağa kaldırabilirsiniz.

  • Web uygulaması (backend)
  • Veritabanı (DB)
  • Cache (Redis)

Neden Docker Compose kullanılır?

Birden fazla container’ı manuel tek tek çalıştırmak zor

Bağımlılıkları (DB → backend) otomatik yönetmek isteriz

Ortamı (dev/test/prod) aynı yapı ile kurmak isteriz

Temel Compose Komutları

Uygulamayı başlatmak için aşağıdaki komutu çalıştırmanız yeterlidir.

docker compose up

Arka planda çalıştırmak için aşağıdaki komutu çalıştırmanız yeterlidir.

docker compose up -d

Uygulamayı durdur için aşağıdaki komutu çalıştırmanız yeterlidir.

docker compose down

Logları görmek için aşağıdaki komutu çalıştırmanız yeterlidir.

docker compose logs

Sadece bir servisi başlatmak için aşağıdaki komutu çalıştırmanız yeterlidir.

docker compose up web 

Docker Compose artık Docker’ın içine gömülü geliyor. Yani çoğu sistemde ayrıca kurman gerekmez.

Docker Compose YAML formatı kullanır. YAML ise key–value mantığıyla çalışır. YAML için 2 boşluk girinti standarttır. Ancak TAB kullanarak 2 boşluk yapılması önerilmez. Bu konuda bilginiz yok ise araştırmanız faydalı olacaktır. Aşağıdaki formata bakarak kafanızda bir şey oturabilir.

Bunlar dışında Docker Compose’ta en çok kullanılan özel anahtarları, ne işe yaradıklarıyla birlikte, tablo halinde aşağıda verilmiştir. 

1️⃣ ÜST SEVİYE (Root) ANAHTARLAR

Anahtar Açıklama PROD Notu
version Compose dosya formatı sürümü 3.9 önerilir (Eski versiyon girilirse güncel özellikler kullanılamaz.)
services Container tanımları ZORUNLU
volumes Kalıcı veri alanları DB için şart
networks Container ağları Güvenlik için önemli
configs Konfigürasyon dosyaları Nadiren
secrets Şifre / secret yönetimi Kısıtlı kullanım

2️⃣SERVICES ALTINDAKİ ANAHTARLAR

Anahtar Açıklama PROD Tavsiyesi
image Kullanılacak image latest kullanma
build Dockerfile’dan build Prod’da image önerilir
container_name Container ismi Opsiyonel
ports Host ↔ container port Reverse proxy ile aç
expose Sadece internal port Güvenli
environment Ortam değişkenleri .env ile kullan
env_file Ortam dosyası PROD’da şart
volumes Volume bağlama DB için zorunlu
networks Bağlı olduğu ağ İzolasyon sağlar
depends_on Başlama sırası DB → app
restart Otomatik restart unless-stopped
healthcheck Servis sağlık durumu PROD’da önerilir
command CMD override Gerektiğinde
entrypoint ENTRYPOINT override Dikkatli
user Container user Güvenlik için
working_dir Çalışma dizini Opsiyonel
labels Metadata Monitoring için
logging Log ayarları Disk taşmasını önler
deploy Swarm ayarları Compose’ta sınırlı

3️⃣VOLUMES ANAHTARLARI

Anahtar Açıklama Örnek
Named volume Docker yönetir pgdata:/var/lib/...
Bind mount Host dizini ./data:/data
driver Volume driver local
driver_opts Driver ayarları Nadir

4️⃣NETWORKS ANAHTARLARI

Anahtar Açıklama PROD Kullanımı
bridge Varsayılan ağ En yaygın
external Harici network Proxy için
internal Dışa kapalı ağ Güvenlik
driver Ağ tipi bridge

5️⃣SECRETS

Anahtar Açıklama Not
file Dosyadan secret Swarm uyumlu
external Harici secret Gelişmiş kullanım

6️⃣HEALTHCECK

Alan Açıklama
test Kontrol komutu
interval Kontrol aralığı
timeout Maks süre
retries Kaç deneme
start_period İlk bekleme

7️⃣LOGGING

Alan Açıklama
driver Log driver
max-size Dosya boyutu
max-file Dosya sayısı

Docker Compose

Yukarıdaki bilgilerden sonra artık örnek yapabiliriz. İlk olarak kendinize çalışma klasörü oluşturun. Hemen ardından docker compose uygun olacak şekilde bir dosya açalım. Bu docker-compose.yml/yaml veya compose.yml/yaml olabilir.

vi compose.yaml

Açılan pencerede https://github.com/docker/awesome-compose/tree/master/official-documentation-samples/wordpress/ linki üzerinden ilgili compose içeriğini yapıştıralım. Kopyaladığınız bu dosya Docker Compose ile WordPress + Veritabanı (MariaDB/MySQL) kurulumunun içeriğidir. Şimdi satır satır, ne işe yarıyor, mantığı ne şeklinde açıklayayım.

Bu compose dosyası 2 servis ayağa kaldırır ve bunlar services altında bulunur. Container’ların tanımlandığı ana bölüm her alt başlık bir container bir servistir. 

1. db: olan bu servis WordPress’in bağlanacağı veritabanı container olmakla birlikte buna bağlı imaj seçimi olarak image: mariadb:10.6.4-focal yani MariaDB 10.6.4 kullanılıyor. Focal ise Ubuntu 20.04 tabanlı olduğunu söylüyor.

  • command kısmında ise command: '--default-authentication-plugin=mysql_native_password' yazan container’ın başlarken çalıştıracağı ana komutun parametresini veya kendisini değiştirir. Bu komut sayesinde MySQL/MariaDB için kimlik doğrulama yöntemi WordPress ile uyumlu hale gelir. Aksi halde bağlantı hatası alabilirsin
  • volumes:  - db_data:/var/lib/mysql kısmı docker ile aynı şekilde database verileri burada tutulur ve container silinse bile verilerin silinmemesi için kullanılır.
  • restart: always anı şekilde container çökse bile tekrar başlar ve sunucu reboot olursa otomatik kalkar.
  • environment:  - MYSQL_ROOT_PASSWORD=somewordpress  - MYSQL_DATABASE=wordpress  - MYSQL_USER=wordpress  - MYSQL_PASSWORD=wordpress ortam değişkeni kısmında yazanlar ise database ayarları için gerekli olan parametreler. Bunlar, root şifresi, WordPress için DB adı, WordPress kullanıcısı ve WordPress şifresidir.
  • expose:  - 3306  - 33060 ise dışa açmadan port paylaşımıdır. Sadece Docker network içinde erişilebilir ve Host’tan erişilemez.

2. wordpress: olan bu servis Web arayüzü + PHP + Apache/Nginx içeren WordPress containeri olmakla birlikte buna bağlı imaj seçimi olarak image: wordpress:latest kullanılmaktadır.

  • volumes:  - wp_data:/var/www/html kısmı  docker ile aynı şekilde WordPress dosyaları (tema, plugin, upload) verileri burada tutulur ve container silinse bile verilerin silinmemesi için kullanılır.
  • ports:  - 80:80  host’un 80 portunu container 80 portu yönlendirir bu sayede tarayıcıdan direkt erişim sağlar.
  • restart: always anı şekilde container çökse bile tekrar başlar ve sunucu reboot olursa otomatik kalkar.
  • environment:  - WORDPRESS_DB_HOST=db  - WORDPRESS_DB_USER=wordpress  - WORDPRESS_DB_PASSWORD=wordpress  - WORDPRESS_DB_NAME=wordpress ortam değişkeni kısmında yazanlar ise wordpress veritabanına bağlanmasını sağlar.

3. volumes:  db_data:  wp_data: kısmı ise kafa karıştırabilir. Servis içinde volume varken aşağıda neden yazdığını düşünebilirsiniz. En alt kısımda yazan volume veya network bunları oluşturmanızı sağlarken, Servis içindeki volumes ise oluşturduğunuzu container'a bağlamanızı sağlar.

services:
  db:
    image: mariadb:10.6.4-focal
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060
  wordpress:
    image: wordpress:latest
    volumes:
      - wp_data:/var/www/html
    ports:
      - 80:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
volumes:
  db_data:
  wp_data:

Şimdi servisi ayağa kaldıralım.

docker-compose up

Web sitesinin geldiğini doğrulayın.

 

dfgdfgdfgdfg
Blog'a Dön