ใช้ Traefik เป็น Reverse Proxy สำหรับ Docker แบบ DevOps
Traefik คือ Reverse Proxy ที่ออกแบบมาเพื่อ Docker โดยเฉพาะ จุดเด่นคือการตรวจจับ Container อัตโนมัติผ่าน Docker Labels ไม่ต้องเข้าหน้าเว็บ UI เลย เมื่อ Deploy Container ใหม่ Traefik จะตรวจพบและตั้งค่า Routing อัตโนมัติทันที
Traefik vs Nginx Proxy Manager
| เปรียบเทียบ | Traefik | Nginx Proxy Manager |
|---|---|---|
| การตั้งค่า | Docker Labels | Web UI |
| Auto-detect Container | ✓ อัตโนมัติ | ✗ ตั้งเอง |
| SSL | Let's Encrypt อัตโนมัติ | Let's Encrypt ผ่าน UI |
| ความยาก | สูงกว่า | ง่าย |
| Dashboard | มี รองรับ Read-only | มี แก้ไขได้ |
| เหมาะสำหรับ | DevOps, Microservices | ผู้เริ่มต้น, VPS |
ติดตั้ง Traefik ด้วย Docker Compose
สร้างไฟล์ docker-compose.yml สำหรับ Traefik:
version: '3.8'
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
command:
- "--api.insecure=true" # Dashboard (dev only)
- "--providers.docker=true" # ตรวจจับ Docker
- "--providers.docker.exposedbydefault=false" # ไม่ Expose อัตโนมัติ
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=admin@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
ports:
- "80:80"
- "443:443"
- "8080:8080" # Traefik Dashboard
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik_letsencrypt:/letsencrypt
networks:
- proxy_network
volumes:
traefik_letsencrypt:
networks:
proxy_network:
external: true
ตั้งค่า Container ด้วย Labels
วิธีเชื่อมต่อ Traefik กับ Application Container คือการใส่ Labels ใน docker-compose.yml:
services:
wordpress:
image: wordpress:latest
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.wordpress.rule=Host(`blog.example.com`)"
- "traefik.http.routers.wordpress.entrypoints=websecure"
- "traefik.http.routers.wordpress.tls.certresolver=letsencrypt"
- "traefik.http.services.wordpress.loadbalancer.server.port=80"
networks:
- proxy_network
- internal_network
networks:
proxy_network:
external: true
internal_network:
อธิบาย Labels แต่ละอัน
| Label | ความหมาย |
|---|---|
traefik.enable=true | สั่งให้ Traefik ตรวจจับ Container นี้ |
routers.wordpress.rule=Host(...) | กำหนด Domain ที่ผูกกับ Container |
routers.wordpress.entrypoints=websecure | ใช้ HTTPS Entry Point |
tls.certresolver=letsencrypt | ขอ SSL จาก Let's Encrypt |
loadbalancer.server.port=80 | Port ภายใน Container |
บังคับ HTTP เป็น HTTPS
labels:
- "traefik.enable=true"
# HTTPS Router
- "traefik.http.routers.wordpress.rule=Host(`blog.example.com`)"
- "traefik.http.routers.wordpress.entrypoints=websecure"
- "traefik.http.routers.wordpress.tls.certresolver=letsencrypt"
# HTTP to HTTPS Redirect
- "traefik.http.routers.wordpress-http.rule=Host(`blog.example.com`)"
- "traefik.http.routers.wordpress-http.entrypoints=web"
- "traefik.http.routers.wordpress-http.middlewares=redirect-to-https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
Traefik Dashboard
เข้าถึง Traefik Dashboard ได้ที่ http://server-ip:8080 เพื่อดูสถานะ Router, Service และ Middleware ทั้งหมด หมายเหตุ: ใน Production ควรปิด Dashboard หรือใส่ Authentication
สรุป
| คุณสมบัติ | รายละเอียด |
|---|---|
| Auto-discovery | ตรวจจับ Container อัตโนมัติผ่าน Docker Socket |
| Labels Config | ตั้งค่า Routing ใน docker-compose.yml |
| SSL Auto | ขอ Let's Encrypt อัตโนมัติ เมื่อ Deploy Container |
| Dashboard | ดูสถานะ Real-time |
บทความสุดท้ายของชุด Reverse Proxy & SSL จะเป็นเรื่อง SSL Certificate ด้วย Certbot ซึ่งเป็นวิธีผลิต SSL แบบดั้งเดิม ใช้ได้เมื่อต้องการผลิต Certificate เองเพื่อใช้กับ Nginx โดยตรงหรือระบบอื่นๆ