ใช้ 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"
      - "[email protected]"
      - "--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 โดยตรงหรือระบบอื่นๆ