format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightDocker Compose Nedir ve Neden Kullanılır?
- arrow_rightDocker Compose'ın Temel Avantajları
- arrow_rightDocker Compose Kurulumu
- arrow_rightLinux'ta Kurulum
- arrow_rightDocker Desktop ile Kurulum
- arrow_rightDocker Compose Dosya Yapısı (docker-compose.yml)
- arrow_rightTemel Yapı ve Sürüm Uyumsuzluğu
- arrow_rightServis Tanımlama Seçenekleri
- arrow_rightDocker Compose Temel Komutları
- arrow_rightServisleri Başlatma ve Durdurma
- arrow_rightServisleri İzleme ve Yönetme
- arrow_rightYapılandırma Doğrulama
- arrow_rightPratik Örnek: LAMP Stack Kurulumu
- arrow_rightProje Yapısı
- arrow_rightdocker-compose.yml İçeriği
- arrow_rightindex.php Örneği
- arrow_rightKurulum ve Çalıştırma
- arrow_rightOrtam Değişkenleri ve Yapılandırma
- arrow_right.env Dosyası Kullanımı
- arrow_rightdocker-compose.yml'de .env Kullanımı
- arrow_rightAğ Yönetimi ve İzolasyon
- arrow_rightAğ Türleri
- arrow_rightÖzel Ağ Yapılandırması
- arrow_rightVeri Hacimleri ve Kalıcılık
- arrow_rightNamed Volumes
- arrow_rightVolume Yönetimi
- arrow_rightDocker Compose ve Docker Swarm Entegrasyonu
- arrow_rightSwarm Modunda Deploy
- arrow_rightDeployment Yapılandırması
- arrow_rightİleri Düzey Yapılandırma
- arrow_rightHealth Check Tanımlama
Docker Compose Nedir ve Neden Kullanılır?
Docker Compose, çoklu konteyner uygulamalarını tanımlamak ve çalıştırmak için kullanılan bir araçtır. Tek bir YAML dosyası aracılığıyla tüm servisleri, ağları ve hacimleri yapılandırmanıza olanak tanır. Docker konteyner teknolojisi ile birlikte kullanıldığında, geliştirme ve üretim ortamlarında tutarlılık sağlar.
2024 itibarıyla Docker kullanı istatistiklerine göre, kurumsal ortamların %67'si çoklu konteyner dağıtımları için Docker Compose veya benzeri orkestrasyon araçlarını tercih etmektedir. Bu araç, özellikle mikro hizmet mimarilerinde kritik bir öneme sahiptir.
Docker Compose'ın Temel Avantajları
- Tek Dosya Yönetimi: Tüm servisler tek bir compose dosyasında tanımlanır
- Hızlı Başlatma: Tek komutla tüm ortamı ayağa kaldırabilirsiniz
- Ortam Tutarlılığı: Geliştirme, test ve üretim ortamlarında aynı yapılandırma
- Bağımlılık Yönetimi: Servisler arası bağımlılıkları otomatik olarak çözer
- Kolay Ölçeklendirme: Servisleri yatay olarak kolayca ölçeklendirebilirsiniz
Docker Compose Kurulumu
Docker Compose'u kullanmadan önce sisteminizde Docker'ın kurulu olması gerekir. Kurulum için aşağıdaki adımları izleyebilirsiniz.
Linux'ta Kurulum
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
Docker Desktop ile Kurulum
Windows veya macOS kullanıyorsanız, Docker Desktop'u indirdiğinizde Docker Compose otomatik olarak kurulur. Bu yöntem en basit kurulum seçeneğidir ve bulut sunucu yönetimi için de önerilir.
Docker Compose Dosya Yapısı (docker-compose.yml)
Docker Compose'un kalbi olan docker-compose.yml dosyası, tüm uygulama yapılandırmasını içerir. Doğru syntax kullanımı, hatasız bir dağıtım için kritiktir.
Temel Yapı ve Sürüm Uyumsuzluğu
version: '3.8' # Docker Engine sürümüne uygun sürüm seçin
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- frontend-network
app:
build: .
environment:
- NODE_ENV=production
depends_on:
- db
networks:
- frontend-network
- backend-network
db:
image: postgres:15
volumes:
- postgres-data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secure_password
networks:
- backend-network
networks:
frontend-network:
backend-network:
volumes:
postgres-data:
Sürüm uyumsuzluğu hakkında: Docker Compose sürüm 2.x ve 3.x arasında bazı farklılıklar vardır. Güncel olarak Docker Engine 20.x+ için sürüm 3.8 önerilmektedir.
Servis Tanımlama Seçenekleri
Her servis için kullanabileceğiniz temel yapılandırma seçenekleri şunlardır:
| Parametre | Açıklama | Örnek |
|---|---|---|
| image | Kullanılacak Docker imajı | nginx:alpine |
| build | Dockerfile yolu | build: ./app |
| ports | Port eşleme | "80:8080" |
| volumes | Veri hacmi bağlama | ./data:/app/data |
| environment | Ortam değişkenleri | NODE_ENV=production |
| depends_on | Servis bağımlılıkları | depends_on: db |
| networks | Ağ yapılandırması | my-network |
| restart | Yeniden başlatma politikası | always |
Docker Compose Temel Komutları
Docker Compose ile çalışırken sıklıkla kullanacağınız temel komutları aşağıda bulabilirsiniz.
Servisleri Başlatma ve Durdurma
# Tüm servisleri arka planda başlat
docker-compose up -d
# Belirli bir dosya ile başlat
docker-compose -f custom-compose.yml up -d
# Servisleri yeniden oluştur
docker-compose up -d --force-recreate
# Servisleri durdur ve temizle
docker-compose down
Servisleri İzleme ve Yönetme
# Çalışan servisleri listele
docker-compose ps
# Servis loglarını takip et
docker-compose logs -f
# Belirli bir servisin loglarını görüntüle
docker-compose logs -f web
# Servisleri ölçeklendir
docker-compose up -d --scale web=3
# Servislerde bash komutu çalıştır
docker-compose exec app bash
Bu komutlar, özellikle yük dengeleyici kurulumlarında birden fazla kopya çalıştırırken kritik önem taşır.
Yapılandırma Doğrulama
# YAML dosyasını doğrula
docker-compose config
# Hizmetleri yeniden oluştur
docker-compose build
# Kullanılmayan hacimleri temizle
docker-compose down -v
Pratik Örnek: LAMP Stack Kurulumu
Gerçek bir senaryo olarak, Docker Compose ile tam teşekküllü bir LAMP (Linux, Apache, MySQL, PHP) stack kuralım.
Proje Yapısı
project/
├── docker-compose.yml
├── html/
│ └── index.php
└── mysql/
└── init.sql
docker-compose.yml İçeriği
version: '3.8'
services:
web:
image: php:8.2-apache
ports:
- "80:80"
volumes:
- ./html:/var/www/html
depends_on:
- db
networks:
- lamp-network
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass
volumes:
- mysql-data:/var/lib/mysql
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- lamp-network
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: db
PMA_PORT: 3306
ports:
- "8080:80"
depends_on:
- db
networks:
- lamp-network
networks:
lamp-network:
driver: bridge
volumes:
mysql-data:
index.php Örneği
<?php
$host = 'db';
$db = 'myapp';
$user = 'appuser';
$pass = 'apppass';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$pdo = new PDO($dsn, $user, $pass);
echo "<h1>Docker Compose ile LAMP Stack</h1>";
echo "<p>Veritabanı bağlantısı başarılı!</p>";
?>
Kurulum ve Çalıştırma
# Projeyi başlat
docker-compose up -d
# Servislerin durumunu kontrol et
docker-compose ps
# Web arayüzüne erişim
# Tarayıcıda http://localhost:80 adresine gidin
# phpMyAdmin erişimi
# Tarayıcıda http://localhost:8080 adresine gidin
Ortam Değişkenleri ve Yapılandırma
Güvenli ve esnek bir yapılandırma için ortam değişkenlerini doğru şekilde kullanmalısınız.
.env Dosyası Kullanımı
# .env dosyası
COMPOSE_PROJECT_NAME=myapp
COMPOSE_FILE=docker-compose.yml
# Veritabanı
DB_ROOT_PASSWORD=secure_root_password
DB_PASSWORD=secure_user_password
# Uygulama
APP_ENV=production
LOG_LEVEL=error
docker-compose.yml'de .env Kullanımı
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
env_file:
- .env
Bu yöntem, kurumsal e-posta sunucuları gibi hassas veriler içeren uygulamalarda güvenlik açısından önemlidir.
Ağ Yönetimi ve İzolasyon
Docker Compose'ta ağ yapılandırması, servisler arası iletişimi ve izolasyonu yönetmek için kullanılır.
Ağ Türleri
| Ağ Türü | Açıklama | Kullanım Senaryosu |
|---|---|---|
| bridge | Varsayılan ağ sürücüsü, konteynerler arası iletişim | Standart uygulamalar |
| host | Host makineyle aynı ağ namespace'i | Performans kritik uygulamalar |
| overlay | Çoklu Docker host arası ağ | Swarm modu |
| none | td>Ağ bağlantısı yokGüvenlik kritik izolasyon |
Özel Ağ Yapılandırması
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
backend:
driver: bridge
internal: true # Harici erişimi engeller
services:
web:
networks:
- frontend
api:
networks:
- frontend
- backend
database:
networks:
- backend
Veri Hacimleri ve Kalıcılık
Konteynerler geçici yapılar olduğundan, veri kalıcılığı için hacimleri doğru şekilde yapılandırmalısınız.
Named Volumes
services:
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
- ./backups:/backups # Host'tan bağlama
volumes:
pgdata: # Named volume
Volume Yönetimi
# Hacimleri listele
docker volume ls
# Hacim bilgilerini görüntüle
docker volume inspect project_pgdata
# Kullanılmayan hacimleri temizle
docker volume prune
Bu yapılandırma, depolama sunucusu çözümleriyle entegre edilebilir.
Docker Compose ve Docker Swarm Entegrasyonu
Büyük ölçekli dağıtımlar için Docker Swarm ile entegrasyon kritik öneme sahiptir.
Swarm Modunda Deploy
# Swarm'ı başlat
docker swarm init
# Stack olarak deploy et
docker stack deploy -c docker-compose.yml myapp
# Stack'leri listele
docker stack ls
# Stack servislerini görüntüle
docker stack services myapp
# Stack'i kaldır
docker stack rm myapp
Deployment Yapılandırması
services:
web:
image: nginx:alpine
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
placement:
constraints:
- node.role == worker
İleri Düzey Yapılandırma
Health Check Tanımlama
services:
web:
image: nginx:alpine
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
db:
image: postgres:15
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5