I. Giới thiệu
Docker Swarm là công cụ quản lý container được tích hợp trong Docker, nó là một công cụ giúp bạn dễ dàng mở rộng và quản lý các container trên một hoặc nhiều máy chủ. Trong bài này mình sẽ giới thiệu cơ bản về Docker Swarm bao gồm 3 mục chính node, service và stack và ví dụ cơ bản triển khai Docker Swarm.
II. Nội dung
1. Node
Trong Docker Swarm node có thể hiểu là máy chủ ảo hoặc máy chủ vậy lý có chạy Docker Engine và tham gia vào Swarm, trong Swarm các nodes sẽ có 2 roles là manager và worker
1.1 Manager node
Manager node trong Docker Swarm có hai loại là Leader Manager và Follower Manager:
– Leader Manager: Quản lý trạng thái cluster, phân phối tasks đến các nodes, xử lý yêu cầu từ client, duy trì tính nhất quán.
– Follower Manager: Đồng bộ trạng thái với Leader Manager, xác nhận và ghi nhận các thay đổi, thay thế Leader Manager khi cần.
Trên thực tế manager node nếu bạn không có cấu hình đặc biệt nào thì manager node cũng có thể thực hiện chạy các tasks của service, quản lý container. Nhưng điều đó là không nên vì manager node chỉ nên tập trung vào việc quản lý và điều phối còn worker node tập trung vào việc chạy các services. Vậy để hạn chế manager node chạy service thì ta xử lý như nào?
Để hạn chế khi triển khai một service bất kì bạn cần sử dụng thêm option sau: –constraint ‘node.role == worker’ trường hợp này sẽ chỉ triển khai service trên các worker node
1.2 Worker node
– Vai trò chính của Worker node là thực hiện chạy các tasks của service, quản lý container, báo cáo trạng thái task cho manager node
2. Service
Service trong Docker Swarm ta có thể hiểu là một ứng dụng hoặc chỉ là một thành phần của ứng dụng service có thể chạy trên một hoặc nhiều container. Để triển khai một service chúng ta cần có image. Service cũng cung cấp cho ta các OPTIONS để cấu hình service đó như: replicas, network, config, secret và constraint…
Ví dụ triển khai một service:
docker service create \
--name web_service --constraint 'node.role == worker' \
--network ingress --replicas 5 --publish 8080:80 \
--config source=nginx-config,target=/etc/nginx/nginx.conf \
--secret source=my_secret_password,target=my_secret_password \
nginx
Mô tả cho câu lệnh trên:
–name web_service tên service là web_service
–constraint ‘node.role == worker’ chỉ triển khai trên các worker node
–network ingress sử dụng mạng có tên là ingress
–replicas 5 số lượng bản sao của service là 5 (5 tasks)
–publish 8080:80 Port host là 8080, port container là 80
–config source=nginx-config,target=/etc/nginx/nginx.conf mount config nginx-config vào container tại /etc/nginx/nginx.conf
–secret source=secret_password,target=secret_password mount secret secret_password vào container tại /run/secrets/secret_password
nginx là image sử dụng cho service
3. Stack
Stack trong Docker Swarm giúp ta quản lý các services thông qua file cấu hình YAML, ta có thể định nghĩa triển khai các services, networks, volumns, configs và secrets một cách có tổ chức đồng thời tối ưu hóa quy trình triền khai ứng dụng.
Ví dụ file config YAML:
version: '3.8'
networks: #Tạo network
web-overlay-network:
driver: overlay
volumes: # Tạo volumn
nginx:
name: volumn_nginx
driver: local
services:
web:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- nginx:/var/log/nginx #sử dụng volume được tạo ở trên
networks:
- web-overlay-network #sử dụng network được tạo ở trên
deploy:
replicas: 2 # Thiết lập số lượng bản sao là 2
configs:
- source: nginx_site_config #Sử dụng tên config
target: /etc/nginx/conf.d/default.conf #mount file
secrets:
- source: ssl_certificate
target: /etc/letsencrypt/live/quyenvk.click/fullchain.pem
- source: ssl_key
target: /etc/letsencrypt/live/quyenvk.click/privkey.pem
configs:
nginx_site_config: #Tên config
file: ./nginx/nginx-site.conf #file trên host
secrets:
ssl_certificate:
file: ./secrets/fullchain.pem
ssl_key:
file: ./secrets/privkey.pem
4. Câu lệnh thường dùng
4.1. Câu lệnh thường dùng “docker swarm”
Xem các lệnh của “docker swarm”
docker swarm --help
Create Swarm:
docker swarm init
Tại manager node bạn có thẻ chạy command sau để xem command join swarm:
#Manager
docker swarm join-token manager
#Worker
docker swarm join-token worker
Sau khi đã join nếu bạn muốn leave
docker swarm leave
4.2. Câu lệnh thường dùng “docker node”
Xem các lệnh của “docker node”
docker node --help
Xem danh sách nodes hiện tại
docker node ls
Chuyển đổi manager node của NODE_ID chỉ đỉnh thành worker node
docker node demote <NODE_ID>
Cập nhật một node thường dùng để cập nhật role, label(metadata)…
#Ví dụ cập nhật thay đổi role của NODE_ID chỉ định thành worker
docker node update --role worker <NODE_ID>
Xóa một node, để xóa 1 node yêu cầu node đó phải có STATUS là “down“
docker node rm <NODE_ID>
Xem thông tin chi tiết một hoặc nhiều node
docker node inspect <NODE_ID> <NODE_ID> …
4.3. Câu lệnh thường dùng “docker service”
Mô tả: <SERVICE> ở đây có thể là SERVICE_ID hoặc SERVICE_NAME
Xem các lệnh của “docker service”
docker service --help
Create service
#Image: nginx
#Tên service: web-example
#Số lượng replicas là 1
#Port: Port host là 8008 port container là 80
docker service create --name web-example --replicas 1 --publish 8008:80 nginx
Xem danh sách service
docker service ls
Scale một hoặc nhiều service
docker service scales <SERVICE>=<NUM_REPLICAS> <SERVICE>=<NUM_REPLICAS> …
Cập nhật service
#Ví dụ cập nhật số lượng replicas của service thành 2
docker service update --replicas 2 <SERVICE>
Xem danh sách các tasks của một service
docker service ps <SERVICE>
Xem log một service hoặc task (Task các bạn có thể hiểu là 1 service có 3 replicas thì mỗi 1 replicas là 1 task)
docker service logs <SERVICE>|<TASK_ID>
#Bạn muốn xem 10 dòng cuối cùng sử dụng -n 10
#Bạn muốn follow log output -f
docker service logs -f -n 5 <SERVICE>|<TASK_ID>
#HOẶC
docker service logs -fn 5 <SERVICE>|<TASK_ID>
Xóa một hoặc nhiều service
docker service rm <SERVICE> <SERVICE> …
Rollback một service
docker service rollback <SERVICE>
#VD về cách rollback hoạt động
#- Lần 1 tạo service có số replicas = 2
#- Lần 2 Update số replicas = 3
#- Lần 3 Update số replicas = 4
#- Lần 4 Update số replicas = 5
#- Tiến hành rollback lần 1 => số replicas = 4
#- Tiến hành rollback lần 2 => số replicas = 5
#- Tiến hành rollback lần 3 => số replicas = 4
Xem thông tin chi tiết một hoặc nhiều service
docker service inspect <SERVICE> <SERVICE> …
4.4 Câu lệnh thường dùng “docker stack”
Xem các lệnh của “docker stack”
docker stack --help
Xem danh sách stack
docker stack ls
Deploy một stack
docker stack deploy -c <FILE_YAML> <STACK_NAME>
Xóa một stack
docker stack rm <STACK_NAME>
Xem các tasks trong stack
docker stack ps <STACK_NAME>
Xem các services trong stack
docker stack services <STACK_NAME>
III. Ví dụ triển khai docker swarm
Trong ví dụ này mình sẽ khởi tạo Docker Swarm và sẽ có 1 manager node và 1 worker node. Mình sẽ tiến hành deploy service nginx sử dụng “docker stack”
– Khởi tạo Docker Swarm và xem các câu lệnh command join manager và worker:
docker swarm init
docker swarm join-token manager
docker swarm join-token worker
– OK sau khi đã khởi tạo xong swarm thì mình sẽ sang server worker sử dụng command add worker vào swarm như sau
– Quay sang manager node kiểm tra xem danh sách nodes hiện tại
Bên trên bao gồm thông tin các nodes, ta có thể thấy có 1 manager node và 1 worker node có STATUS là Ready. Đối với node id có dấu * cho biết bạn đang ở manager node nào trong swarm
– Tiếp theo mình có 1 file YAML như sau:
version: '3.8'
networks: #Tạo network
web-overlay-network:
driver: overlay
volumes: # Tạo volumn
nginx:
name: volumn_nginx
driver: local
services:
web:
image: nginx:latest
ports:
- '80:80'
volumes:
- nginx:/var/log/nginx #sử dụng volume được tạo ở trên
networks:
- web-overlay-network #sử dụng network được tạo ở trên
deploy:
replicas: 2 # Thiết lập số lượng bản sao là 2
resources:
limits:
cpus: '0.5' # Giới hạn CPU là 0.5 (50% của một CPU)
memory: 512M # Giới hạn bộ nhớ là 512MB
reservations:
cpus: '0.25' # Đặt trước 25% CPU
memory: 256M # Đặt trước 256MB bộ nhớ
update_config:
parallelism: 2 # Cập nhật hai container cùng lúc
delay: 10s # Chờ 10 giây giữa mỗi nhóm cập nhật
failure_action: rollback # Rollback nếu cập nhật thất bại
monitor: 30s # Thời gian giám sát mỗi cập nhật
max_failure_ratio: 0.1 # Tỷ lệ lỗi tối đa cho phép (10%)
restart_policy:
condition: on-failure # Restart nếu container gặp lỗi
placement:
constraints:
- node.role == worker #Chỉ deploy trên các worker node
– Sau khi có file YAML mình tiến hành sử dụng stack để deploy với câu lệnh sau:
docker stask deploy -c <FILE_YAML> <STACK_NAME>
– Kiểm tra service chúng ta thấy đã có 1 service được chạy với số lượng replicas là 2
– Kiểm tra container trên manager node và worker node
Chúng ta có thể thấy trong file YAML chúng ta setup chỉ triển khai trên worker node nên manager node không có container nào
Hiện tại manager node của mình có IP publish là 34.125.200.228 và worker node có IP publish là 34.125.159.44 và như các bạn có thể thấy trên manager node mình không triển khai các service trên đó bây giờ thử truy cập vào website xem chuyện gì xảy ra.
Chúng ta có thể thấy tuy chỉ triển khai service trên worker node nhưng khi người dùng truy cập vào địa chỉ IP của manager node kết quả vẫn truy cập được vào service trên worker node vậy chuyện gì đang xả ra ở đây. Đó là do Docker Swarm sử dụng Ingress network bạn có thể xem hình ảnh sau để hiểu rõ hơn cách Ingress network hoạt động:
Trên hình ảnh cách Ingress network hoạt động là khi người dùng truy cập vào node3 trong Docker Swarm không có container chạy trên đó, Ingress Network sẽ sử dụng cơ chế routing mesh để định tuyến đến một trong các container của service tương ứng đang chạy trên node1 và node2 trong cluster. Như vậy với ví dụ trên của chúng ta có thể hiểu tại sao khi truy cập vào địa chỉ IP của manager node vẫn ra được kết quả.
IV. Kết luận
Chúng ta có thể thấy Docker Swarm rất dễ sử dụng cho việc quản lý các ứng dụng container hóa trong môi trường phân tán với khả năng tự động phục hồi, cần bằng tải giúp các ứng dụng hoạt động hiệu quả và ổn định. Trong bài này mình đã chia sẻ nội dung cơ bản về Docker Swarm.
Cảm ơn các bạn đã đọc!