Docker Compose Nedir?
Birden fazla container'ı tek bir YAML dosyasıyla tanımlayıp yönetmenizi sağlar. Mikroservis mimarileri için idealdir.
docker-compose.yml Yapısı
version: '3.8'
services:
service_name:
image: image_name
# veya
build: ./path
ports:
- "host:container"
environment:
- VAR=value
volumes:
- volume:/path
depends_on:
- other_service
networks:
- network_name
restart: unless-stopped
volumes:
volume_name:
networks:
network_name:
Örnek: WordPress + MySQL
version: '3.8'
services:
db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
volumes:
- db_data:/var/lib/mysql
networks:
- wp_network
wordpress:
image: wordpress:latest
restart: unless-stopped
depends_on:
- db
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
networks:
- wp_network
volumes:
db_data:
wp_data:
networks:
wp_network:
Örnek: Laravel + MySQL + Redis + Nginx
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./:/var/www
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
networks:
- laravel
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- ./:/var/www
environment:
- DB_HOST=mysql
- REDIS_HOST=redis
depends_on:
- mysql
- redis
networks:
- laravel
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: laravel
volumes:
- mysql_data:/var/lib/mysql
networks:
- laravel
redis:
image: redis:alpine
networks:
- laravel
volumes:
mysql_data:
networks:
laravel:
driver: bridge
Compose Komutları
# Başlat (arka planda)
docker compose up -d
# Loglar
docker compose logs
docker compose logs -f app
# Durdur
docker compose down
# Volume'larla birlikte sil
docker compose down -v
# Yeniden oluştur
docker compose up -d --build
# Belirli servisi yeniden başlat
docker compose restart app
# Scale (çoğalt)
docker compose up -d --scale app=3
# Servis durumu
docker compose ps
Environment Dosyaları
# .env dosyası
MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=myapp
APP_PORT=8080
# docker-compose.yml
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
app:
ports:
- "${APP_PORT}:80"