Docker Swarm เบื้องต้น: Orchestrate Container บน Cloud VPS

เมื่อแอปพลิเคชันเติบโตขึ้น การรัน Container เพียงตัวเดียวบนเครื่องเดียวอาจไม่เพียงพออีกต่อไป Docker Swarm คือระบบ Container Orchestration ในตัวของ Docker ที่ช่วยให้คุณสามารถบริหารจัดการ Container หลายตัวบนหลายเครื่องได้อย่างมีประสิทธิภาพ รองรับ High Availability, Load Balancing และ Rolling Update โดยไม่ต้องพึ่งพาเครื่องมือภายนอก

Docker Swarm คืออะไร?

Docker Swarm เป็นฟีเจอร์ Native Clustering ของ Docker ที่รวม Docker Host หลายเครื่องเข้าเป็น Cluster เดียวที่เรียกว่า Swarm ช่วยให้คุณ Deploy และจัดการ Service บน Cluster ได้ราวกับทำงานบนเครื่องเดียว ด้วยคำสั่ง Docker ที่คุ้นเคย

ประโยชน์ของ Docker Swarm

  • High Availability: หากโหนดล้มเหลว Container จะถูกย้ายไปรันบนโหนดอื่นโดยอัตโนมัติ
  • Load Balancing: กระจาย Traffic ไปยัง Container ทุกตัวในบริการโดยอัตโนมัติ
  • Scaling: ขยายหรือลด Container ด้วยคำสั่งเดียว
  • Rolling Update: อัปเดต Image ได้โดยไม่ต้อง Downtime
  • Secure by Default: การสื่อสารระหว่างโหนดเข้ารหัสด้วย TLS

สถาปัตยกรรมของ Docker Swarm

Docker Swarm ประกอบด้วยโหนด 2 ประเภทหลัก:

1. Manager Node

ทำหน้าที่เป็น Control Plane ของ Swarm รับผิดชอบการจัดการสถานะ Cluster, Scheduling Task, และรับคำสั่งจาก Docker CLI ควรมีอย่างน้อย 3 โหนดเพื่อรองรับ High Availability ใช้อัลกอริธึม Raft Consensus ในการตัดสินใจ

2. Worker Node

รับ Task จาก Manager และรัน Container จริง Worker Node ไม่มีสิทธิ์จัดการ Cluster แต่มีหน้าที่รันงานตามที่ได้รับมอบหมาย สามารถเพิ่ม Worker Node ได้ไม่จำกัดเพื่อรองรับโหลดที่เพิ่มขึ้น

แนวคิดหลักใน Docker Swarm

แนวคิด คำอธิบาย
Service คำอธิบายของงานที่ต้องการรัน ระบุ Image, Port, Replicas
Task หน่วยการทำงานที่เล็กที่สุด — Container 1 ตัว บน 1 โหนด
Replica จำนวนสำเนาของ Container ที่ต้องการรันพร้อมกัน
Overlay Network Network ที่ครอบคลุมหลายโหนด ช่วยให้ Container ข้ามโหนดคุยกันได้
Stack กลุ่ม Service ที่ Deploy พร้อมกันจากไฟล์ docker-compose.yml

การติดตั้งและตั้งค่า Docker Swarm

ขั้นตอนที่ 1: เตรียม Cloud VPS

สำหรับการทดสอบ ต้องการ VPS อย่างน้อย 2 เครื่อง (1 Manager + 1 Worker) โดยแต่ละเครื่องต้องติดตั้ง Docker ไว้แล้ว และเปิด Port ต่อไปนี้:

  • 2377/tcp: การสื่อสาร Cluster Management
  • 7946/tcp และ 7946/udp: การสื่อสารระหว่างโหนด
  • 4789/udp: Overlay Network Traffic

ขั้นตอนที่ 2: สร้าง Swarm บน Manager Node

รันคำสั่งนี้บน Manager Node (แทนที่ IP ด้วย Public IP ของเครื่อง):

# เริ่มต้น Swarm
docker swarm init --advertise-addr <MANAGER_IP>

# ตัวอย่าง output:
# Swarm initialized: current node (xxx) is now a manager.
# To add a worker to this swarm, run the following command:
#   docker swarm join --token SWMTKN-1-xxx <MANAGER_IP>:2377

คำสั่งนี้จะให้ Join Token สำหรับ Worker Node มา ให้เก็บ Token ไว้ใช้ในขั้นตอนถัดไป

ขั้นตอนที่ 3: เพิ่ม Worker Node เข้า Swarm

รันคำสั่งนี้บน Worker Node แต่ละเครื่อง:

docker swarm join --token SWMTKN-1-xxx <MANAGER_IP>:2377

ถ้าลืม Token สามารถขอดูได้บน Manager Node:

# ดู token สำหรับ worker
docker swarm join-token worker

# ดู token สำหรับ manager เพิ่มเติม
docker swarm join-token manager

ขั้นตอนที่ 4: ตรวจสอบ Cluster

# ดูรายการโหนดทั้งหมด
docker node ls

# ตัวอย่าง output:
# ID        HOSTNAME    STATUS    AVAILABILITY    MANAGER STATUS
# abc123 *  manager-1   Ready     Active          Leader
# def456    worker-1    Ready     Active

การ Deploy Service บน Docker Swarm

สร้าง Service

# สร้าง Nginx service พร้อม 3 Replicas
docker service create \
  --name my-web \
  --replicas 3 \
  --publish published=80,target=80 \
  nginx:latest

# ดูสถานะ Service
docker service ls

# ดูรายละเอียด Task ของ Service
docker service ps my-web

Scale Service

# เพิ่ม Replica เป็น 5 ตัว
docker service scale my-web=5

# หรือใช้ update
docker service update --replicas 5 my-web

Rolling Update

# อัปเดต Image พร้อมกำหนดพฤติกรรม Rolling Update
docker service update \
  --image nginx:1.25 \
  --update-parallelism 1 \
  --update-delay 10s \
  my-web

# ดู log ระหว่าง update
docker service ps my-web

--update-parallelism 1 หมายถึงอัปเดตทีละ 1 Container และ --update-delay 10s รอ 10 วินาทีระหว่างแต่ละ Container เพื่อให้มั่นใจว่าระบบยังทำงานได้ระหว่างอัปเดต

Deploy Stack ด้วย Docker Compose

Docker Swarm สามารถใช้ไฟล์ docker-compose.yml ในการ Deploy ทั้ง Stack ได้:

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: on-failure
    networks:
      - webnet

  visualizer:
    image: dockersamples/visualizer:latest
    ports:
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      placement:
        constraints:
          - node.role == manager
    networks:
      - webnet

networks:
  webnet:
    driver: overlay
# Deploy stack
docker stack deploy -c docker-compose.yml myapp

# ดู Service ทั้งหมดใน Stack
docker stack services myapp

# ดู Task ทั้งหมดใน Stack
docker stack ps myapp

# ลบ Stack
docker stack rm myapp

High Availability ด้วย Multiple Manager

เพื่อให้ Swarm ทนต่อความล้มเหลวของ Manager Node ควรมี Manager อย่างน้อย 3 โหนด โดยใช้อัลกอริธึม Raft:

จำนวน Manager ทนความล้มเหลวได้ Quorum ที่ต้องการ
1 0 โหนด 1
3 1 โหนด 2
5 2 โหนด 3
7 3 โหนด 4

แนะนำให้ใช้ Manager จำนวนคี่ (3, 5, 7) เพื่อป้องกัน Split-brain และจำกัด Manager ไม่เกิน 7 โหนดเพื่อประสิทธิภาพ Consensus

Docker Swarm vs Kubernetes

คุณสมบัติ Docker Swarm Kubernetes
ความง่ายในการใช้งาน ง่าย เรียนรู้เร็ว ซับซ้อน เรียนรู้นาน
การ Setup รวดเร็ว ใช้เวลามากกว่า
Scalability ดีสำหรับขนาดกลาง ดีมากสำหรับขนาดใหญ่
Features พื้นฐานครบ ครบถ้วนและยืดหยุ่นมาก
Community เล็กกว่า ใหญ่มาก
เหมาะกับ โปรเจกต์ขนาดเล็ก-กลาง Production ขนาดใหญ่

คำสั่งที่ใช้บ่อยใน Docker Swarm

คำสั่ง ความหมาย
docker swarm init สร้าง Swarm ใหม่
docker swarm join เพิ่มโหนดเข้า Swarm
docker node ls ดูรายการโหนดทั้งหมด
docker service create สร้าง Service ใหม่
docker service ls ดูรายการ Service ทั้งหมด
docker service scale ปรับจำนวน Replica
docker service update อัปเดต Service
docker stack deploy Deploy Stack จากไฟล์ Compose
docker stack rm ลบ Stack ทั้งหมด

สรุป

Docker Swarm เป็นจุดเริ่มต้นที่ดีเยี่ยมสำหรับการทำ Container Orchestration ติดตั้งง่าย ใช้คำสั่ง Docker ที่คุ้นเคย และมีฟีเจอร์พื้นฐานครบถ้วนทั้ง High Availability, Load Balancing และ Rolling Update เหมาะสำหรับทีมที่ต้องการขยาย Infrastructure บน Cloud VPS โดยไม่ต้องเรียนรู้ระบบที่ซับซ้อนอย่าง Kubernetes

สำหรับธุรกิจที่ต้องการ Cloud VPS ที่มีประสิทธิภาพสูงสำหรับรัน Docker Swarm Cluster Dot Enterprise Cloud VPS พร้อมให้บริการด้วยโครงสร้างพื้นฐานที่แข็งแกร่ง รองรับการขยายตัวของระบบได้อย่างยืดหยุ่น