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