Docker Compose

Multi-container uygulamalar için Docker Compose

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"