เมื่อแอปพลิเคชันเติบโตขึ้น การรัน 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 พร้อมให้บริการด้วยโครงสร้างพื้นฐานที่แข็งแกร่ง รองรับการขยายตัวของระบบได้อย่างยืดหยุ่น

