Bao gồm các Manager và các Worker. Người dùng có thể khai báo trạng thái mong muốn của nhiều service để chạy trong Swarm sử dụng YAML files.
Bạn đang xem: Từ Điển Anh Việt " Swarm Là Gì, Thông Tin Chi Tiết Về Dự Án Swarm

Làm việc với Docker Swarm
Trong phần này ta sẽ tiến hành thực hành với Docker Swarm thông qua demo nhỏ.Đầu tiên ta cần 4 máy ảo (vps ảo) để tạo các máy ảo ta sử dụng câu lệnh sau:
$ docker-machine create Trong đó:
: tên máy ảo bạn muốn đặt.Tạo machine(máy ảo) cho swarm manager:
$ docker-machine create managerTiếp đến là các machine cho swarm worker lần lượt là : worker1, worker2, worker3.
$ docker-machine create worker1$ docker-machine create worker2$ docker-machine create worker3Sau khi tạo xong ta kiểm tra list machine:
$ docker-machine ls

Bây giờ ta sử dụng lệnh inspect thử xem thông tin của một machine
$ docker-machine inspect manager

Dễ thấy một số thông tin cơ bản về machine như: địa chỉ IP, MachineName (tên do ta đặt), SSHKey để có thể truy cập vào machine thông qua SSHKey này, thông tin về CPU ( 1 CPU), Memory ( 1GB), ….
Việc setup các machine đã hoàn tất giờ ta tiến hành khởi tạo swarm trên con manager nhé và để truy cập vào con manager hay các con worker thì ta sử dụng thông qua SSH cụ thể như sau:
$ docker-machine ssh Ở đây:
= managerVà để quay lại host local:
$ exitKhởi tạo swarm
$ docker swarm init --advertise-addr Nếu bạn đang sử dụng Docker Desktop for Mac hoặc Docker Desktop for Windows thì chỉ cần docker swarm init . Nhưng ở đây Operating System là Boot2Docker nên buộc phải có flag --advertise-addr.

Kiểm tra list node hiện đang có trong swarm
$ docker node ls

Những node (machine/vps) là manager thì mới có xem list này và dấu * cho biết bạn đang ở node manager nào trong swarm. Ở đây ta chỉ có một node manager và node này đang ở status Ready. OK ! vậy là xong nhiệm vụ ở con manager.
Giờ ta chuyển qua làm việc trên con worker1 nhé. Tại worker1 ta tiến hành join nó vào swarm như một worker:
$ docker swarm join --token :Trong đó:
host: Địa chỉ ip của con manager.port: Cổng port của con manager.Để lấy thông tin về token thì trên con manager của swarm đó ta sử dụng lệnh
$ docker swarm join-token

Trên hai con worker2 và worker3 ta cũng làm tương tự
Lưu ý: một node worker chỉ có thể join vào một swarm.
Trên node manager ta kiểm tra lại list node

Vậy là ta đã tạo thành công 3 con worker và 1 con manager và gom chúng thành một swarm (cluster).
Một câu hỏi được đặt ra ở đây là tại sao ở đây ta không tận dụng cái swarm mà ta đã tạo ra ở Phần 3 tại máy host local (Docker Desktop for Mac) và coi nó như một node manager để join các node khác vào swarm này mà lại tạo ra thêm một machine để làm node manager chi cho phí tài nguyên như thế ? Thì câu trả lời nằm ở Phần 3 (đã có nói rất rõ) trên phiên bản Docker Desktop for Mac không thể mở luồng định tuyến tới các machine nên việc ta cố gắng join các node (machine/vps) vào swarm với manager swarm là host local là vô tác dụng. Đây cũng chính là điểm yếu khi triển khai networking trên OSX.
Bây giờ ta tiếp tục tạo ra service và các replicas cũng như deploy trên node manager.
Để làm được điều này ta cần config file docker-compose.yml:
Xem thêm: Kèo tỷ số chính xác là gì? Bắt kèo tỷ số thế nào cho chuẩn?
version: "3"services: webreactjs: image: quanphamptit/docker-swarm-demo:webreactjs_1 build: . ports: - 3000:3000 restart: always networks: - my-net deploy: mode: replicated replicas: 3 servergo: image: quanphamptit/docker-swarm-demo:servergo_1 build: . ports: - 8080:8080 restart: always networks: - my-net deploy: mode: replicated replicas: 3networks: my-net: driver: overlayvà copy file docker-compose.yml mà ta đã config qua bên con manager:
$ docker-machine scp filesource name-machine:/path-docker-machine/Trong demo này:
$ docker-machine scp ~/Workspace/gocode/docker-swarm-demo/docker-compose.yml manager:/home/docker/docker-compose.ymlTiếp theo ta cần push 2 image mà ở Phần 2 ta đã sử dụng lên repository trên hub.docker nhé:
$ docker tag /:$ docker push /Trong đó:
: Id image bạn muốn push
: là username trên hub.docker của bạn.
: tên repository bạn muốn đặt.
: tên tag bạn muốn đặt cho image được push lên đó.

Trên Docker Hub

Vậy là ta đã push thành công 2 image và giờ ta cần deploy stack :
$ docker stack deploy -c /home/docker/docker-compose.yml swarm-demo-appKiểm tra list services:

Ta thử xem các bản replicas này đang chạy trên những node nào nhé:

Ngoài ra bạn có thể tạo service dùng lệnh với cú pháp như sau:
$ docker service create --replicas --name Trong đó:
: số task bạn muốn tạo ra ( hay nói cách khác là số bản sao của image/container).: tên service bạn muốn đặt.: ID của image/container.: lệnh muốn chạy.Và ta 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 =Trong đó :
: tên service mà ta muốn đổi số container.: Số container mong muốn.Tiếp theo ta sẽ xem thử liệu tính năng load balancing hoạt động thế nào nhé ?
Ta thấy trên con node worker3 không có giữ replicas của service servergo_1 nào cả. Ta tiến hành gửi request thử tới service servergo_1 trên con worker3 này xem sao nhé !
$ curl http://192.168.99.103:8080/api/v1/foods?id=2

Điều này có nghĩa là khi ta gửi các request đến các node trong swarm. Các node này có thể chứa một hoặc nhiều replicas của các service hoặc không hề chứa cái replicas nào cả thì Routing mesh của swarm sẽ chuyển tiếp các request đó đi qua ingress network tới Swarm Load Balancer, bộ balancer này sẽ phân bổ request tới các container của các service ở các machine( host/vps của manager và worker) cùng chung một mạng swarm. Bạn có thể xem hình sau để hiểu rõ hơn:

Thử lại với các request khác:

Bây giờ ta thử shutdown con machine worker1 ( như trên thực tế khi 1 server bị die ) xem có điều mới lạ gì không nhé !
$ docker-machine stop Ở đây :
= worker1
Kiểm tra lại list node và service trên node manager


Tại đây ta đã thấy điều mới lạ đó. Khi worker1 bị Shutdown thì lúc này swarm manager sẽ tiến hành tạo thêm 1 replicas mới để thay để cho 1 replicas đã bị Shutdown đó và tiến hành chuyển 1 replicas mới này cho các worker đang run (cụ thể là worker3). Đây cũng chính là tính năng Desired state reconciliation, Scaling đã được nói rõ trong phần Tính năng Docker Swarm.
Vậy vấn đề nảy sinh ở đây khi toàn bộ node worker bị die thì điều gì sẽ xảy ra sau đó ?
Xem thêm: lưỡng quốc trạng nguyên là ai
Trong trường hợp này node manager cũng sẽ tiến hành thêm các replicas để đảm bảo đủ số replicas mà ta đã config (mong muốn) và chạy trên chính con manager này ( nghĩa là node manager sẽ đóng vai trò là node worker luôn). Và nếu con manager này die luôn thì mọi chuyện coi như chấm hết !!.
Trường hợp ngược lại nếu các node worker đang run nhưng con node manager bị die thì external storage sẽ ghi nhận điều đó và thông báo đến các manager node còn lại trong cluster. Và external storage sẽ chọn một node manager bất kỳ để làm Leader tiếp theo của cluster.

Nếu bạn muốn xem được những bài viết chất lượng, hay thảo luận những kiến thức, chia sẻ hiểu biết của bạn đến mọi người, hãy tham gia group của bọn mình trên Facebook nhé: ^^
Bình luận