Chuyển đến nội dung chính

Bài 17: Docker Swarm - Container Orchestration

Docker Swarm mode, tạo và quản lý cluster, services, tasks, replicas, rolling updates, rollback, overlay networking, ingress load balancing, placement constraints, secrets management và Swarm vs Kubernetes comparison.

🔒 DevSecOps — Bài 17 Bài 17: Docker Swarm - Container Orchestration

Docker từ Cơ bản đến Nâng cao

Phần 5: Production và Advanced Topics

xdev.asia

1. Docker Swarm - Tổng quan

Docker Swarm là native container orchestration tool của Docker, cho phép quản lý cluster gồm nhiều Docker hosts và triển khai services trên đó.

Kiến trúc Swarm

┌─────────────────────────────────────────┐
│              Docker Swarm               │
│                                         │
│  ┌─────────────┐  ┌─────────────┐      │
│  │  Manager 1  │  │  Manager 2  │      │
│  │  (Leader)   │  │  (Follower) │      │
│  │             │  │             │      │
│  │  Raft       │←→│  Raft       │      │
│  │  Consensus  │  │  Consensus  │      │
│  └─────────────┘  └─────────────┘      │
│         │                │              │
│  ┌──────▼───┐  ┌────────▼──┐  ┌──────┐│
│  │ Worker 1 │  │ Worker 2  │  │Wkr 3 ││
│  │ ┌──────┐ │  │ ┌──────┐  │  │      ││
│  │ │Task 1│ │  │ │Task 2│  │  │      ││
│  │ │Task 3│ │  │ │Task 4│  │  │      ││
│  │ └──────┘ │  │ └──────┘  │  │      ││
│  └──────────┘  └───────────┘  └──────┘│
└─────────────────────────────────────────┘

2. Tạo Swarm Cluster

# Khởi tạo Swarm (trên manager node)
docker swarm init --advertise-addr 192.168.1.10

Output sẽ cho join token

docker swarm join --token SWMTKN-xxx 192.168.1.10:2377

Lấy join token cho worker

docker swarm join-token worker

Lấy join token cho manager

docker swarm join-token manager

Join cluster (trên worker nodes)

docker swarm join --token SWMTKN-xxx 192.168.1.10:2377

Xem nodes trong cluster

docker node ls

Promote worker thành manager

docker node promote worker-1

Demote manager thành worker

docker node demote manager-2

Leave swarm

docker swarm leave # Worker docker swarm leave --force # Manager (last one)

3. Services, Tasks và Replicas

# Tạo service
docker service create \
    --name web \
    --replicas 3 \
    --publish published=80,target=80 \
    nginx:1.27-alpine

Liệt kê services

docker service ls

Xem tasks của service

docker service ps web

Xem logs

docker service logs web docker service logs -f web

Scale service

docker service scale web=5

Inspect service

docker service inspect --pretty web

4. Rolling Updates và Rollback

# Tạo service với update config
docker service create \
    --name api \
    --replicas 3 \
    --update-parallelism 1 \
    --update-delay 10s \
    --update-order start-first \
    --update-failure-action rollback \
    --rollback-parallelism 1 \
    --rollback-delay 5s \
    myapp:1.0

Update image (rolling update)

docker service update --image myapp:2.0 api

Rollback

docker service rollback api

Update với environment variables

docker service update
--env-add NEW_VAR=value
--env-rm OLD_VAR
api

Update resource limits

docker service update
--limit-cpu 1.0
--limit-memory 512m
api

5. Overlay Networking

# Tạo overlay network
docker network create -d overlay my-overlay

Tạo encrypted overlay

docker network create -d overlay --opt encrypted my-secure-overlay

Service sử dụng overlay network

docker service create
--name api
--network my-overlay
myapp

docker service create
--name db
--network my-overlay
postgres:16

api có thể kết nối db bằng hostname "db"

Ingress Load Balancing

Swarm tự động load balance traffic đến service replicas thông qua ingress network:

# Traffic đến bất kỳ node nào trên port 80
# sẽ được route đến một replica của web service
docker service create \
    --name web \
    --replicas 3 \
    --publish 80:80 \
    nginx

Routing mesh: Request → Any Node → Ingress → Service Container

6. Placement Constraints

# Chạy service trên nodes cụ thể
docker service create \
    --name db \
    --constraint 'node.role == manager' \
    postgres:16

docker service create
--name api
--constraint 'node.labels.environment == production'
--constraint 'node.labels.region == asia'
myapp

Label nodes

docker node update --label-add environment=production worker-1 docker node update --label-add region=asia worker-1

Placement preferences (soft constraints)

docker service create
--name web
--replicas 6
--placement-pref 'spread=node.labels.datacenter'
nginx

7. Secrets và Configs trong Swarm

# Tạo secret
echo "mysecretpassword" | docker secret create db_password -
docker secret create ssl_cert ./server.crt

Sử dụng secret

docker service create
--name db
--secret db_password
-e POSTGRES_PASSWORD_FILE=/run/secrets/db_password
postgres:16

Tạo config

docker config create nginx_conf ./nginx.conf

Sử dụng config

docker service create
--name web
--config source=nginx_conf,target=/etc/nginx/nginx.conf
nginx

8. Stack Deploy

# docker-stack.yml
version: '3.8'

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

api: image: myapp:latest deploy: replicas: 2 resources: limits: cpus: '0.5' memory: 256M secrets: - db_password networks: - frontend - backend

db: image: postgres:16-alpine deploy: placement: constraints: - node.role == manager volumes: - db-data:/var/lib/postgresql/data secrets: - db_password networks: - backend

networks: frontend: backend:

volumes: db-data:

secrets: db_password: external: true

# Deploy stack
docker stack deploy -c docker-stack.yml myapp

# Liệt kê stacks
docker stack ls

# Xem services trong stack
docker stack services myapp

# Xem tasks
docker stack ps myapp

# Remove stack
docker stack rm myapp

9. Docker Swarm vs Kubernetes

Feature Docker Swarm Kubernetes
Complexity Đơn giản, dễ setup Phức tạp hơn
Learning curve Thấp Cao
Scaling Tốt cho small-medium Tốt cho mọi quy mô
Auto-scaling Không built-in HPA, VPA, Cluster Autoscaler
Ecosystem Nhỏ Rất lớn (CNCF)
Community Nhỏ hơn Rất lớn
Use case Small teams, simple deployments Enterprise, complex microservices

10. Tổng kết

Trong bài này, bạn đã nắm được:

  • Docker Swarm architecture và cluster setup

  • Services, tasks, replicas

  • Rolling updates và rollback

  • Overlay networking và ingress

  • Placement constraints

  • Secrets, configs, và stack deploy

  • Swarm vs Kubernetes comparison

Bài tiếp theo sẽ hướng dẫn Docker cho Microservices Architecture.