Docker Compose Rehberi: Çok Konteynerli Uygulama Yönetimi
Docker Compose ile çok konteynerli uygulama tanımlama, servis bağımlılıkları, environment variables, health check, scaling ve production deployment. Kapsamlı rehber.
Traefik kurulumu, Docker provider ile otomatik servis keşfi, Let's Encrypt SSL, middleware yapılandırması, dashboard, Kubernetes Ingress Controller ve yük dengeleme.
Traefik, mikroservis mimarileri için tasarlanmış modern bir edge router ve reverse proxy'dir. Docker ve Kubernetes ile derin entegrasyonu sayesinde servisleri otomatik olarak keşfeder ve yönlendirir.
Traefik'in temel özellikleri:
Traefik v3, v2'ye kıyasla daha iyi performans ve yeni özellikler sunar. Bu rehber Traefik v3 üzerine odaklanmaktadır.
# docker-compose.yml
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "8080:8080" # Dashboard (production'da kapatın)
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/etc/traefik/traefik.yml:ro
- ./config:/etc/traefik/config:ro
- traefik_certs:/certs
networks:
- traefik-net
labels:
- "traefik.enable=true"
# Dashboard
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz$$hash"
- "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
volumes:
traefik_certs:
networks:
traefik-net:
external: true
# traefik.yml
global:
checkNewVersion: true
sendAnonymousUsage: false
api:
dashboard: true
insecure: false # Production'da false
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
http:
tls:
certResolver: letsencrypt
http3:
advertisedPort: 443
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
storage: /certs/acme.json
httpChallenge:
entryPoint: web
# DNS challenge (wildcard için)
# dnsChallenge:
# provider: cloudflare
# resolvers:
# - "1.1.1.1:53"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: traefik-net
file:
directory: /etc/traefik/config
watch: true
log:
level: INFO
filePath: /var/log/traefik/traefik.log
accessLog:
filePath: /var/log/traefik/access.log
bufferingSize: 100
Docker label'ları ile servisleri otomatik olarak Traefik'e kaydedin:
# Örnek uygulama
services:
webapp:
image: nginx:alpine
networks:
- traefik-net
labels:
# Traefik'i etkinleştir
- "traefik.enable=true"
# HTTP router
- "traefik.http.routers.webapp.rule=Host(`app.example.com`)"
- "traefik.http.routers.webapp.entrypoints=websecure"
- "traefik.http.routers.webapp.tls.certresolver=letsencrypt"
# Servis portu
- "traefik.http.services.webapp.loadbalancer.server.port=80"
# Middleware uygula
- "traefik.http.routers.webapp.middlewares=security-headers,rate-limit"
networks:
traefik-net:
external: true
services:
api:
image: myapi:latest
networks:
- traefik-net
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.example.com`)"
- "traefik.http.routers.api.entrypoints=websecure"
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
- "traefik.http.services.api.loadbalancer.server.port=3000"
# Health check
- "traefik.http.services.api.loadbalancer.healthcheck.path=/health"
- "traefik.http.services.api.loadbalancer.healthcheck.interval=30s"
frontend:
image: myfrontend:latest
networks:
- traefik-net
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`example.com`) || Host(`www.example.com`)"
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
- "traefik.http.services.frontend.loadbalancer.server.port=80"
networks:
traefik-net:
external: true
# config/middlewares.yml
http:
middlewares:
# Güvenlik başlıkları
security-headers:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
stsPreload: true
forceSTSHeader: true
contentTypeNosniff: true
frameDeny: true
referrerPolicy: "strict-origin-when-cross-origin"
customResponseHeaders:
X-Powered-By: ""
Server: ""
# Rate limiting
rate-limit:
rateLimit:
average: 100
burst: 50
period: 1m
sourceCriterion:
ipStrategy:
depth: 1
# Basic auth
basic-auth:
basicAuth:
users:
- "admin:$apr1$xyz$hashedpassword"
removeHeader: true
# IP whitelist
ip-whitelist:
ipAllowList:
sourceRange:
- "192.168.1.0/24"
- "10.0.0.0/8"
# Redirect www to non-www
www-redirect:
redirectRegex:
regex: "^https://www\\.(.*)"
replacement: "https://${1}"
permanent: true
# Compress
compress:
compress:
excludedContentTypes:
- text/event-stream
labels:
# Middleware tanımla ve uygula
- "traefik.http.middlewares.myapp-auth.basicauth.users=user:$$apr1$$hash"
- "traefik.http.middlewares.myapp-ratelimit.ratelimit.average=50"
- "traefik.http.middlewares.myapp-ratelimit.ratelimit.burst=20"
- "traefik.http.routers.myapp.middlewares=myapp-auth,myapp-ratelimit"
# Redirect middleware
- "traefik.http.middlewares.redirect-https.redirectscheme.scheme=https"
- "traefik.http.middlewares.redirect-https.redirectscheme.permanent=true"
# Güvenli dashboard yapılandırması
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
- "traefik.http.routers.traefik-dashboard.service=api@internal"
- "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
- "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
- "traefik.http.routers.traefik-dashboard.middlewares=dashboard-auth"
- "traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$apr1$$xyz$$hash"
Basic auth şifresi oluşturma:
# htpasswd ile şifre oluştur
echo $(htpasswd -nB admin) | sed -e s/\\$/\\$\\$/g
# Veya openssl ile
echo "admin:$(openssl passwd -apr1 'sifreniz')" | sed -e 's/\$/\$\$/g'
# Traefik Helm deposunu ekle
helm repo add traefik https://traefik.github.io/charts
helm repo update
# Traefik kur
helm install traefik traefik/traefik \
--namespace traefik \
--create-namespace \
--set deployment.replicas=2 \
--set ports.web.redirectTo.port=websecure \
--set ingressRoute.dashboard.enabled=true
# ingressroute.yml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: webapp-ingress
namespace: default
spec:
entryPoints:
- websecure
routes:
- match: Host(`app.example.com`)
kind: Rule
services:
- name: webapp-service
port: 80
middlewares:
- name: security-headers
tls:
certResolver: letsencrypt
# middleware.yml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: security-headers
namespace: default
spec:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
contentTypeNosniff: true
frameDeny: true
# traefik.yml - TCP entrypoint
entryPoints:
mysql:
address: ":3306"
redis:
address: ":6379"
# config/tcp.yml
tcp:
routers:
mysql-router:
entryPoints:
- mysql
rule: "HostSNI(`*`)"
service: mysql-service
services:
mysql-service:
loadBalancer:
servers:
- address: "mysql:3306"
# Docker label ile TCP
labels:
- "traefik.tcp.routers.mysql.rule=HostSNI(`*`)"
- "traefik.tcp.routers.mysql.entrypoints=mysql"
- "traefik.tcp.services.mysql.loadbalancer.server.port=3306"
# Birden fazla instance ile yük dengeleme
services:
api:
image: myapi:latest
deploy:
replicas: 3
networks:
- traefik-net
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.example.com`)"
- "traefik.http.services.api.loadbalancer.server.port=3000"
# Sticky sessions
- "traefik.http.services.api.loadbalancer.sticky.cookie=true"
- "traefik.http.services.api.loadbalancer.sticky.cookie.name=traefik_session"
- "traefik.http.services.api.loadbalancer.sticky.cookie.secure=true"
# Health check
- "traefik.http.services.api.loadbalancer.healthcheck.path=/health"
- "traefik.http.services.api.loadbalancer.healthcheck.interval=10s"
- "traefik.http.services.api.loadbalancer.healthcheck.timeout=3s"
Traefik, modern mikroservis altyapıları için güçlü bir reverse proxy ve load balancer çözümüdür. Docker ve Kubernetes ile derin entegrasyonu, otomatik SSL yönetimi ve zengin middleware ekosistemi ile production ortamlarında güvenilir bir seçimdir. Label tabanlı yapılandırması sayesinde her servis kendi routing kurallarını tanımlayabilir.
Traefik, Docker/Kubernetes ile derin entegrasyona sahip ve servisleri otomatik olarak keşfeder. Nginx statik yapılandırma gerektirir ve her değişiklikte reload gerekir. Traefik dinamik yapılandırma destekler ve sıfır downtime ile güncellenir. Nginx daha olgun ve yüksek trafikte daha iyi performans gösterebilir. Mikroservis ortamları için Traefik, geleneksel web sunucuları için Nginx tercih edilir.
Dashboard'u asla insecure modda (port 8080) production'da açmayın. Traefik container'ına label ekleyerek dashboard'u HTTPS üzerinden basic auth ile koruyun. IP whitelist middleware ile erişimi belirli IP'lerle sınırlayın. Alternatif olarak dashboard'u tamamen devre dışı bırakıp Prometheus/Grafana ile izleme yapabilirsiniz.
traefik.yml'de certificatesResolvers altında dnsChallenge provider'ını ayarlayın. Cloudflare için 'provider: cloudflare' ve 'CF_DNS_API_TOKEN' environment variable'ı gereklidir. Diğer DNS provider'ları için ilgili API anahtarlarını environment variable olarak tanımlayın. DNS challenge, HTTP challenge'a kıyasla daha güvenlidir ve wildcard sertifika almayı mümkün kılar.
Evet, middleware'ler tanımlandıkları sırayla uygulanır. Genellikle önerilen sıra: IP whitelist → Rate limit → Auth → Headers. Yanlış sıralama beklenmedik davranışlara yol açabilir. Örneğin auth middleware'ini rate limit'ten önce koyarsanız, kimlik doğrulanmamış istekler de rate limit'e dahil edilir.
Docker Swarm veya Kubernetes'te rolling update kullanın. Traefik, yeni container'lar hazır olduğunda otomatik olarak trafiği yönlendirir. Health check yapılandırması kritiktir: sağlıklı olmayan container'lara trafik gönderilmez. 'traefik.http.services.myapp.loadbalancer.healthcheck.path=/health' label'ı ile health check endpoint'i tanımlayın.
Traefik, her domain için ayrı sertifika alır. Birden fazla domain için router rule'unda 'Host(`a.com`) || Host(`b.com`)' kullanın. Her domain için ayrı sertifika otomatik olarak alınır. Wildcard sertifika için DNS challenge gereklidir. SAN sertifikası için manuel yapılandırma veya harici sertifika kullanımı gerekebilir.
Docker Compose ile çok konteynerli uygulama tanımlama, servis bağımlılıkları, environment variables, health check, scaling ve production deployment. Kapsamlı rehber.
GitHub Actions ile CI/CD pipeline oluşturma, Docker build ve push, SSH ile sunucuya deployment, test otomasyonu, secrets yönetimi ve workflow optimizasyonu.
Ansible kurulumu, inventory dosyası, playbook yazımı, rol yapısı, değişkenler, şifreli vault, ad-hoc komutlar ve sunucu yapılandırma otomasyonu. Adım adım rehber.