Docker swarm

Docker swarm là một công cụ giúp chúng ta tạo ra một clustering Docker. Nó giúp chúng ta gom nhiều Docker Engine lại với nhau và ta có thể "nhìn" nó như duy nhất một virtual Docker Engine.

  • Trong phiên bản v1.12.0, Docker Swarm là một tính năng được tích hợp sẵn trong Docker Engine.

Trong phần này, tôi sẽ tạo ra 1 cụm cluster gồm 1 manager và 2 worker chạy dịch vụ web-server. - node manager sẽ là node quản lý cluster. - node worker là các node chạy dịch vụ. Nếu mà node worker die thì node manager sẽ run container trên chính nó.

1. Mô hình.

  • manager: 172.16.69.228
  • worker1: 172.16.69.218
  • worker2: 172.16.69.214

2. Cài đặt.

  • Lưu ý, tất cả được thực hiện dưới quyền root.

2.1 Cài đặt docker engine trên tất cả các node.

curl -sSL https://get.docker.io | bash

2.2 Trên node manager, tạo cluster

docker@manager:~$ docker swarm init --advertise-addr 172.16.69.228

Swarm initialized: current node (a35hhzdzf4g95w0op85tqlow1) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-0kc72gpnhhqnykw56ujwusdtfu5v0thpnmicynktvi8y6lhluc-1kvl428ru2oxx3zgn566gtkmw \
    172.16.69.228:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  • Nếu bạn muốn add thêm các node manager khác, chạy lệnh sau trên node manager:
docker@manager:~$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
 — token SWMTKN-1–5mgyf6ehuc5pfbmar00njd3oxv8nmjhteejaald3yzbef7osl1–8xo0cmd6bryjrsh6w7op4enos \
 172.16.69.228:2377

=> Sau khi chạy lệnh, ta chỉ cần copy dòng lệnh ở output trên vào chạy ở node manager muốn thêm.

2.3 Join worker vào cluster vừa tạo.

  • Trên worker1:
root@worker1:~# docker swarm join \
>     --token SWMTKN-1-0kc72gpnhhqnykw56ujwusdtfu5v0thpnmicynktvi8y6lhluc-1kvl428ru2oxx3zgn566gtkmw \
>     172.16.69.228:2377
This node joined a swarm as a worker.
  • Tương tự, trên worker2
root@worker2:~# docker swarm join \
>     --token SWMTKN-1-0kc72gpnhhqnykw56ujwusdtfu5v0thpnmicynktvi8y6lhluc-1kvl428ru2oxx3zgn566gtkmw \
>     172.16.69.228:2377
This node joined a swarm as a worker.
  • Các bạn chú ý, giá trị token là giá trị lúc tạo manager node.

  • Nếu các bạn quên giá trị token, chạy lệnh sau trên node manager để lấy token.

root@manager:/opt/swarm# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-0kc72gpnhhqnykw56ujwusdtfu5v0thpnmicynktvi8y6lhluc-1kvl428ru2oxx3zgn566gtkmw \
    172.16.69.228:2377

3. Kết quả.

  • Kiểm tra các node:
docker@manager:~$ docker node ls

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
kuiombcp396m6tkyln30yr8vp *  adk       Ready   Active        Leader
mss8z9cbfbp15s6hapaoyfail    adk       Ready   Active        
vh7ezyxntkuys6lwnwz4rwc0g    adk       Ready   Active        

4. Run service

  • Trong phần này, tôi sẽ kết hợp docker-compose cùng docker swarm để deploy web-server như ban đầu đã nói.

4.1 Docker-Compose

version: '3'
services:
   web:
     image: cosy294/swarm:1.0
     ports:
       - "9000:80"
     deploy:
       mode: replicated
       replicas: 3
  • Các bạn chú ý phần deploy:
  • mode: replicated: kết hợp với replicas: 3 Nó có nghĩa là tạo ra 3 container.
  • Nếu modeglobal thì mỗi node sẽ chỉ tạo ra 1 container.

  • Enable Experimental: Tạo file /etc/docker/daemon.json

{
    "experimental": true
}
  • Khởi động lại docker
service docker restart
  • Kiểm tra tính năng experimental đã bật hay chưa
$ docker version -f '{{.Server.Experimental}}'
true
  • Lệnh deploy
docker deploy --compose-file docker-compose.yml linhlt
  • Kết quả:
root@manager:/opt/swarm# docker service ls
ID            NAME        MODE        REPLICAS  IMAGE
piny444k1b8q  linhlt_web  replicated  3/3       cosy294/swarm:1.0
root@manager:/opt/swarm# docker service ps linhlt_web
ID            NAME              IMAGE              NODE  DESIRED STATE  CURRENT STATE              ERROR  PORTS
nx2id4wolgbj  linhlt_web.1      cosy294/swarm:1.0  adk   Running        Running about an hour ago         
tkhoybpc86j2  linhlt_web.2      cosy294/swarm:1.0  adk   Running        Running 25 minutes ago            
xyrn0rkkj2t4  linhlt_web.3      cosy294/swarm:1.0  adk   Running        Running about an hour ago         

4.2 Tính năng scale.

Docker hỗ trợ tính năng scale, có thể thay đổi số container của cluster một cách nhanh chóng bằng câu lệnh sau:

docker service scale name_service=5
  • Trong đó, name_service là tên của service.
  • Tùy theo số container hiện tại của service mà docker có thể tăng hoặc giảm cho đúng với số lượng khai báo ở lệnh trên.

5.Thử nghiệm

5.1 Thử nghiệm 1: Cách các container xử lý request.

Trong image cosy294/swarm:1.0, tôi có cung cấp 1 file hostname.php với ý nghĩa là xuất ra hostname của container đang chạy service. - Tôi viết một đoạn scripts như sau:

#!/bin/bash
for (( i = 1; $i <=12; i++ )); do
  echo $i >> kq.txt
  curl http://172.16.69.228:9000/hostname.php >> kq.txt
  echo -e "\n" >> kq.txt
  sleep 15
done

=> Đoạn scripts này có ý nghĩa là sẽ lấy giá trị hostname trong 12 request.

  • Tôi nhận được kết quả:
root@adk:/opt/swarm# cat kq.txt 
1
642a2a4ae3b8

2
826de3323cb3

3
e36ce7cf9383

4
642a2a4ae3b8

5
e36ce7cf9383

6
826de3323cb3

7
642a2a4ae3b8

8
e36ce7cf9383

9
642a2a4ae3b8

10
e36ce7cf9383

11
826de3323cb3

12
642a2a4ae3b8
  • Các giá trị trên là giá trị của các hostname của container xử lý request.
  • Rút ra được kết luận: Các container sẽ luân phiên tiếp nhận và xử lý các request đến từ người dùng.

5.2 Thử nghiệm 2: Stop docker container.

  • Khi tôi shutdown một container trong node worker1, thì ngay lập tức 1 container mới được tạo ra để đảm bảo số container là 3.

  • Khi tôi stop services docker ở worker1, thì ngay lập tức các container mới sẽ được ta ở các node khác để đảm bảo số container là 3.

Reference

  • https://docs.docker.com/engine/swarm/swarm-tutorial/
  • http://trumhemcut.net/2016/06/26/gioi-thieu-cac-tinh-nang-moi-trong-docker1-12/