รัน WordPress หลายเว็บบน Docker ด้วย Traefik Reverse Proxy

หากคุณต้องการรัน WordPress หลายเว็บไซต์บน Cloud VPS เครื่องเดียวของ de.co.th การใช้ Traefik เป็น Reverse Proxy ร่วมกับ Docker เป็นวิธีที่มีประสิทธิภาพสูง Traefik จัดการ Routing, SSL Certificate และ Load Balancing แบบอัตโนมัติ บทความนี้จะแนะนำวิธีติดตั้งทั้งหมดแบบ Step-by-Step

ทำไมต้อง Traefik?

Traefik เป็น Modern Reverse Proxy ที่ออกแบบมาสำหรับ Container โดยเฉพาะ เมื่อเทียบกับ Nginx Reverse Proxy แบบตั้งค่าแบบ Manual แล้ว Traefik มีข้อดีคือ:

  • ตรวจหา Container ใหม่แบบอัตโนมัติผ่าน Docker Labels
  • ขอ SSL Certificate จาก Let’s Encrypt แบบอัตโนมัติ
  • มี Dashboard สำหรับติดตามการไหลของข้อมูล
  • รองรับ HTTP/2 และ WebSocket โดยไม่ต้องตั้งค่าเพิ่มเติม

สร้างโครงสร้างของโปรเจกต์

จัดโครงสร้างโปรเจกต์สำหรับ Traefik และ WordPress หลายเว็บไซต์:

mkdir -p /opt/docker-multi-wp
cd /opt/docker-multi-wp
mkdir -p traefik site1 site2
touch traefik/acme.json
chmod 600 traefik/acme.json

ตั้งค่า Traefik

สร้างไฟล์ docker-compose.yml สำหรับ Traefik:

# traefik/docker-compose.yml
version: '3.8'

services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    restart: always
    command:
      - --api.dashboard=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.letsencrypt.acme.tlschallenge=true
      - --certificatesresolvers.letsencrypt.acme.email=admin@yourdomain.com
      - --certificatesresolvers.letsencrypt.acme.storage=/acme.json
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./acme.json:/acme.json
    networks:
      - traefik_network
    labels:
      - traefik.enable=true
      - traefik.http.routers.dashboard.rule=Host(`traefik.yourdomain.com`)
      - traefik.http.routers.dashboard.service=api@internal
      - traefik.http.routers.dashboard.middlewares=auth
      - traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz$$hashedpassword

networks:
  traefik_network:
    external: true

สร้าง Docker Network

สร้าง Shared Network สำหรับให้ Traefik เชื่อมต่อกับ WordPress Container ทุกตัว:

docker network create traefik_network

ตั้งค่า WordPress เว็บแรก

สร้างไฟล์ docker-compose.yml สำหรับ WordPress เว็บแรก พร้อม Labels สำหรับ Traefik:

# site1/docker-compose.yml
version: '3.8'

services:
  db:
    image: mariadb:10.11
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: ${DB_PASS}
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - internal

  wordpress:
    image: wordpress:6-apache
    restart: always
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: ${DB_PASS}
    volumes:
      - wp_data:/var/www/html
    networks:
      - internal
      - traefik_network
    labels:
      - traefik.enable=true
      - traefik.http.routers.site1.rule=Host(`site1.yourdomain.com`)
      - traefik.http.routers.site1.entrypoints=websecure
      - traefik.http.routers.site1.tls.certresolver=letsencrypt

volumes:
  db_data:
  wp_data:

networks:
  internal:
  traefik_network:
    external: true

เพิ่ม WordPress เว็บที่สอง

คัดลอกโครงสร้างเดียวกันสำหรับ WordPress เว็บที่สอง เปลี่ยนเฉพาะ Domain และชื่อ Service:

# site2/docker-compose.yml - เปลี่ยนเฉพาะส่วนนี้
    labels:
      - traefik.enable=true
      - traefik.http.routers.site2.rule=Host(`site2.yourdomain.com`)
      - traefik.http.routers.site2.entrypoints=websecure
      - traefik.http.routers.site2.tls.certresolver=letsencrypt

รัน Service ทั้งหมดพร้อมกัน

เริ่มรัน Traefik ก่อน แล้วตามด้วย WordPress แต่ละเว็บไซต์:

# รัน Traefik
cd /opt/docker-multi-wp/traefik
docker-compose up -d

# รัน Site 1
cd /opt/docker-multi-wp/site1
docker-compose up -d

# รัน Site 2
cd /opt/docker-multi-wp/site2
docker-compose up -d

# ตรวจสอบทุก Container
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

เพิ่มเว็บไซต์ใหม่ได้ง่าย

ข้อดีของ Traefik คือเมื่อต้องการเพิ่มเว็บไซต์ใหม่ คุณเพียงแค่:

  • คัดลอกโครงสร้างของโปรเจกต์
  • เปลี่ยน Domain ใน Labels
  • รัน docker-compose up -d

Traefik จะตรวจหา Container ใหม่โดยอัตโนมัติ ขอ SSL Certificate อัตโนมัติ โดยไม่ต้องแก้ไขตั้งค่า Traefik เลย

สรุป

การใช้ Traefik Reverse Proxy ร่วมกับ Docker บน Cloud VPS ของ de.co.th ช่วยให้คุณรัน WordPress หลายเว็บไซต์ได้อย่างมีประสิทธิภาพสูง โดย Traefik จัดการ Routing และ SSL แบบอัตโนมัติ ทำให้การเพิ่มเว็บไซต์ใหม่ทำได้ง่ายและสามารถดูแลเว็บหลายแห่งบน VPS เครื่องเดียวได้อย่างมีประสิทธิภาพ เหมาะสมสำหรับผู้ที่ต้องดูแลเว็บไซต์หลายแห่งบน VPS เครื่องเดียว