メインコンテンツへスキップ
記事一覧へ戻る

Traefik กับ Docker: ให้ Container ประกาศ Route ผ่าน Labels อย่างปลอดภัย

เข้าใจ entrypoint, router และ service ของ Traefik พร้อมตัวอย่าง labels และข้อควรระวังเรื่อง Docker socket

Traefik กับ Docker: ให้ Container ประกาศ Route ผ่าน Labels อย่างปลอดภัย

Traefik เป็น reverse proxy โอเพนซอร์สที่อ่านข้อมูลบริการจากผู้ให้บริการต่าง ๆ รวมถึง Docker ได้ จุดต่างจากไฟล์ proxy ที่แก้มือทุกครั้งคือคอนเทนเนอร์ประกาศกฎผ่าน labels แล้ว Traefik สร้าง routing configuration ตามสถานะที่พบ บทความนี้อ้างอิง Docker quick start และเอกสารของโครงการ เหมาะกับโฮสต์ Docker ที่มีหลายแอปและต้องการลดงานแก้ proxy เมื่อ deploy

โมเดลการไหลของคำขอ

คำขอเข้าที่ entrypoint เช่นพอร์ต 80 หรือ 443; router ใช้กฎ Host หรือ Path เพื่อเลือกคำขอ; service ชี้ไปพอร์ตแอปภายในคอนเทนเนอร์ ความเข้าใจสามชั้นนี้สำคัญ เพราะการที่คอนเทนเนอร์ทำงานอยู่ไม่ได้แปลว่ามี router ตรงกับโดเมน หรือ Traefik รู้พอร์ตที่แอปฟังจริง

ตัวอย่าง Compose สำหรับทดลองในเครื่องที่ตั้ง DNS ของ whoami.example.com แล้ว:

services:
  traefik:
    image: traefik:v3
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
  whoami:
    image: traefik/whoami
    labels:
      - traefik.enable=true
      - traefik.http.routers.whoami.rule=Host(`whoami.example.com`)
      - traefik.http.routers.whoami.entrypoints=web
      - traefik.http.services.whoami.loadbalancer.server.port=80

ใช้ docker compose up -d แล้วทดสอบ curl -H 'Host: whoami.example.com' http://SERVER_IP/ ตัวอย่างเปิด HTTP เพื่อแยกการทดสอบ route ออกจาก TLS; ก่อน production ต้องกำหนด HTTPS และตัวจัดการ certificate ตามเอกสารเวอร์ชันที่ใช้งาน

ตรวจเมื่อ route ไม่เข้า

ถ้าตอบ 404 จาก Traefik ให้ตรวจว่า Host header ตรงกับ rule, entrypoint ถูกพอร์ต และ label อยู่ที่คอนเทนเนอร์ที่ Traefik มองเห็น ถ้าพบ 502 หรือ 504 ให้ตรวจพอร์ตภายในที่ service ชี้, network ที่ทั้งสองคอนเทนเนอร์เข้าถึงกัน และ log ของแอป ค่าพอร์ต published ไปที่ host ไม่ใช่คำตอบเสมอไป เพราะ Docker provider มักสื่อสารผ่าน network ภายใน

ข้อควรระวังด้านปฏิบัติการ

ตัวเลือก exposedByDefault=false ทำให้บริการใหม่ไม่ถูกเปิดเผยโดยบังเอิญ แต่ labels ยังต้องผ่านการ review โดยเฉพาะ route ของฐานข้อมูลหรือ admin UI การ mount Docker socket แม้เป็น read-only ยังให้ Traefik เห็น metadata ของ Docker และเป็นจุดที่ต้องจำกัดสิทธิ์ของผู้ดูแล host; อย่าวาง dashboard สาธารณะโดยไม่มีการป้องกัน เก็บกฎ route กับไฟล์ Compose ใน version control และทดสอบทั้ง URL ที่ควรเข้าได้และ URL ที่ควรได้ 404

Traefik ช่วยให้ route เปลี่ยนตามคอนเทนเนอร์ได้ แต่ความถูกต้องยังขึ้นอยู่กับกฎ Host/Path, พอร์ตและ network ของคุณ เริ่มจากบริการทดสอบหนึ่งตัวก่อนขยายไปทั้งเครื่อง อ่าน คู่มือ Docker ของ Traefik เพื่อปรับค่า TLS และ production เพิ่มเติม.