Docker Swarm: Orchestration cơ bản

Photo of author

Văn Ngọc Tân

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

  1. It nhat 3 managers – Dam bao high availability
  2. Manager chi chạy services quan trong – Worker cho app containers
  3. Luon cơ health checks – Self-healing hoat dong
  4. Resource limits – Tranh container chiem het tai nguyen
  5. Rolling updates – Update tan tom, không down-time
  6. Dung drain thay vi down – Deploy maintenance được
  7. Secrets cho data nhay cam – Khong dùng env vars
  8. Placement constraints – Dat container dùng noi
  9. Monitor Swarm – Docker stats, Prometheus
  10. 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

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận