Bạn có biết?
Bạn bao gio deploy một ứng dụng trên nhiều servers và phải quản lý container bằng tay không? Restart container này, stop container kia, roll out update…
Docker Swarm giúp bạn quản lý container trên nhiều hosts như một đơn vị – tự động distribute, scale, và heal!
Docker Swarm là gì?
Docker Swarm la native orchestration của Docker, cho phep:
- ✅ Clustering – Gom nhiều Docker hosts thanh một cluster
- ✅ Orchestration – Quan ly containers như một đơn vị
- ✅ Load Balancing – Tu dong phan phoi requests
- ✅ Rolling Updates – Cap nhat không down-time
- ✅ Self-healing – Tu dong restart container that bai
- ✅ Service Discovery – Containers tim thay nhau tự động
Khai niem quan trong
Node
Mot Docker host trong Swarm cluster:
- Manager Node – Quan ly cluster, nhan lenh tu user
- Worker Node – Chay containers, nhan viec tu manager
Service
Dinh nghia các containers muon chạy:
# Tao service
$ docker service create --name web --replicas 3 -p 80:80 nginx:latest
# Scale service
$ docker service scale web=5
# Update service
$ docker service update --image nginx:alpine web
Stack
Nhom các services lien quan:
# Deploy stack tu docker-compose.yml
$ docker stack deploy -c docker-compose.yml myapp
Task
Don vi cong viec cho một container:
# Moi task la một container
# Swarm tự động schedule tasks len nodes
# Neu nođể that bai, task được reschedule
Khoi tao Swarm
1. Khoi tao Manager ( trên may 1)
$ docker Swarm init --advertise-addr 192.168.1.100
Swarm initialized: cũrrent nođể (xxxxxxxxxxxx) is now a manager.
To add a worker to this Swarm, run the following command:
docker Swarm join --token SWMTKN-xxxxx 192.168.1.100:2377
2. Them Worker Nodes
# Trên các may khac, chạy lenh join
$ docker Swarm join --token SWMTKN-xxxxx 192.168.1.100:2377
This nođể joined a Swarm as a worker.
3. Them Manager khac
# Trên manager hien tai, lay token
$ docker Swarm join-token manager
# Trên may moi, chạy:
$ docker Swarm join --token SWMTKN-xxxxx 192.168.1.100:2377
4. Kiem tra cluster
# Xem tat ca nodes
$ docker nođể ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xxxxx * manager Ready Active Leader 24.0.0
yyyyy worker1 Ready Active 24.0.0
zzzzz worker2 Ready Active 24.0.0
Deploy Service
1. Tao Service don gian
# Tao service với 3 replicas
$ docker service create --name nginx-web --replicas 3 -p 80:80 nginx:latest
# Xem service
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
abc123 nginx-web replicated 3/3 nginx:latest *:80->80/tcp
2. Xem chi tiet Service
# Xem tasks
$ docker service ps nginx-web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
aaa111 nginx-web.1 nginx:latest worker1 Running Running 5m ago
bbb222 nginx-web.2 nginx:latest worker2 Running Running 5m ago
ccc333 nginx-web.3 nginx:latest manager Running Running 5m ago
3. Scale Service
# Tang replicas
$ docker service scale nginx-web=5
# Giam replicas
$ docker service scale nginx-web=2
4. Remove Service
$ docker service rm nginx-web
Deploy Stack với Docker Compose
docker-compose.yml
version: "3.8"
services:
web:
image: nginx:alpine
ports:
- "80:80"
deploy:
replicas: 3
placement:
constraints:
- node.role == worker
resources:
limits:
cpus: "0.5"
memory: 256M
api:
image: node:20-alpine
command: nođể server.js
deploy:
replicas: 2
placement:
constraints:
- node.role == manager
networks:
- webnet
volumes:
- data:/data
volumes:
data:
Deploy Stack
# Deploy stack
$ docker stack deploy -c docker-compose.yml myapp
# Xem stacks
$ docker stack ls
NAME SERVICES
myapp 2
# Xem services trong stack
$ docker stack services myapp
ID NAME MODE REPLICAS IMAGE
abc123 myapp_web replicated 3/3 nginx:alpine
def456 myapp_API replicated 2/2 node:20-alpine
# Remove stack
$ docker stack rm myapp
Rolling Updates
1. Update image
# Cap nhat image cũa service
$ docker service update --image nginx:1.25 nginx-web
# Update với lag qua trinh
$ docker service update --image nginx:1.25 \
--update-delay 10s \
--update-parallelism 1 \
nginx-web
2. Rollback
# Quay lai phien ban truoc
$ docker service rollback nginx-web
3. Cau hinh Update
deploy:
replicas: 5
update_config:
parallelism: 2 # So container update cũng luc
delay: 10s # Thoi gian giua các lan update
failure_action: pausẽ # Pausẽ neu cơ loi
monitor: 10s
max_failure_ratio: 0.1
rollback_config:
parallelism: 1
delay: 5s
failure_action: pause
monitor: 10s
Health Checks và Self-Healing
1. Docker Health Check
# Them health check trong Dockerfile
FROM nginx:alpine
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD cũrl -f http://localhost/ || exit 1
2. Kiem tra health
$ docker service ps nginx-web
ID NAME IMAGE NODE HEALTH CURRENT STATE
aaa111 nginx-web.1 nginx:latest worker1 healthy Running
bbb222 nginx-web.2 nginx:latest worker2 unhealthy Running
ccc333 nginx-web.3 nginx:latest manager starting Running
# Swarm tự động restart container unhealthy
Drain Node
# Dung nođể (ngung nhan task moi)
$ docker nođể update --availability drain worker1
# Kich hoat lai
$ docker nođể update --availability active worker1
# Hien thì trang thai
$ docker nođể inspect worker1 --format '{{ .Spec.Availability }}'
Secrets Management
1. Tao Secret
# Tu file
$ echo "my-password" | docker secret create db_password -
# Tu stdin
$ docker secret create db_password -
2. Su dùng Secret
$ docker service create \
--name API \
--secret db_password \
-e DB_PASSWORD_FILE=/run/secrets/db_password \
myapp:latest
Ingress Network (Routing Mesh)
# Tat ca nodes deu cơ the nhan request
# Swarm tự động route den dùng container
# Khong can load balancer ben ngoai!
$ docker service create --name web --publish 80:80 nginx:latest
# Request toi bat ky nođể nao cũng được route dùng!
Docker Swarm vs Kubernetes
| Tieu chi | Docker Swarm | Kubernetes |
|---|---|---|
| Do phuc tap | Don gian | Cao |
| Hoc tap | Nhanh | Cham |
| Setup | Chi 1 lenh | Phuc tap hon |
| Quy mo | Den 1000 nodes | Muc dich lon hon |
| Ecosystem | Limited | Rat lon |
| Usẽ case | 中小, MVPs | Enterprise, large scale |
Best Practices
- It nhat 3 managers – Dam bao high availability
- Manager chi chạy services quan trong – Worker cho app containers
- Luon cơ health checks – Self-healing hoat dong
- Resource limits – Tranh container chiem het tai nguyen
- Rolling updates – Update tan tom, không down-time
- Dung drain thay vi down – Deploy maintenance được
- Secrets cho data nhay cam – Khong dùng env vars
- Placement constraints – Dat container dùng noi
- Monitor Swarm – Docker stats, Prometheus
- Backup etcd data – Data cũa Swarm manager
Buoc tiep theo
Bay gio ban da biet cách orchestration với Docker Swarm! Bai cũoi cũng cũa series sẽ tong hop tat ca kien thuc và best practices cho production.
👉 Doc tiep: Docker trong Production: Best Practices và Troubleshooting