Docker

ใช้ Traefik เป็น Reverse Proxy สำหรับ Docker แบบ DevOps

เผยแพร่ · แก้ไขล่าสุด

Traefik คือ Reverse Proxy ที่ออกแบบมาเพื่อ Docker โดยเฉพาะ จุดเด่นคือการตรวจจับ Container อัตโนมัติผ่าน Docker Labels ไม่ต้องเข้าหน้าเว็บ UI เลย เมื่อ Deploy Container ใหม่ Traefik จะตรวจพบและตั้งค่า Routing อัตโนมัติทันที

Traefik vs Nginx Proxy Manager

เปรียบเทียบTraefikNginx Proxy Manager
การตั้งค่าDocker LabelsWeb UI
Auto-detect Container✓ อัตโนมัติ✗ ตั้งเอง
SSLLet'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=80Port ภายใน 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 โดยตรงหรือระบบอื่นๆ