Trang chủTác giảLiên hệ

[Docker swarm - P3] Deploy một stack lên docker swarm

By Nguyễn Thanh Sơn
Published in Docker
June 09, 2021
3 min read

Đây sẽ là bài cuối cùng trong loạt bài về Docker swarm. Ở 2 phần trước mình đã giới thiệu các khái niệm cơ bản cà cách deploy một service lên swarm. Các bạn có thể đọc tại đây: [Docker swarm - P1] Kiến thức cơ bản về Docker swarm [Docker swarm - P2] Tìm hiểu Docker swarm qua các ví dụ đơn giản

Khái niệm về stack

Như ở bài trước mình đã hướng dẫn cách tạo và deploy 1 service lên Docker swarm.

Tuy nhiên, một application thường được cấu thành từ nhiều service khác nhau. Ví dụ một web application thường bao gồm các service sau:

  • Web server
  • Database
  • Redis

Các service cần thiết cho 1 application sẽ được mô ta trong compose file và được gọi là một stack.
Để deploy một stack lên swarm, run comman docker stack deploy với input là một compose file.

Setup mội trường

Bài viết này mình sẽ sử dụng lại swarm đã setup ở phần 2. Các bạn có thể xem lại tại đây

Tiến hành deploy stack

Định nghĩa cấu trúc application

Trong bài viết này mình sẽ tạo một web app đếm số lần user access và website, được cấu thành từ 2 service:

  • Python app
  • Redis

Sau khi xác định được các service cần có của stack, việc tiếp theo đó là tiến hành build stack.

Hãy đảm bảo các file sau được đặt trong cùng một folder trên node Manager.

app.py

Đoạn code python xử lý công việc sau:

  • Tạo một webpage in ra dòng chữ Hello World! I have been seen x times., với x là số lần user access webpage
  • Sử dụng redis để lưu số lần user access webpage. Chú ý address của redis host là redis-host.
  • Publish webpage thông qua port 8000.

requirements.txt

File list các dependencies của python app

Dockerfile

Đây là file dùng để build image cho python app của chúng ta

docker-compose.yml

Đây chính là file dùng để định nghĩa stack của một application

Ở đây tên của redis service là redis-host, cũng chính là redis address được dùng ở file app.py. Với web service, port 8000 của service sẽ được map với port 80 của docker host.

Build và publish image

Để build image, tại folder /var/docker_demo, run command sau:

Sau khi build image xong, ta cần push image đó lên một docker repository để các node khác có thể pull image này về. Cách setup để pull/push một image cá nhân các bạn có thể đọc thêm tại đây

Deploy stack lên swarm

Vậy là các bước chuẩn bị đã xong, bây giờ mình sẽ tiền hành deploy stack vừa tạo lên swarm

Với command trên, mình đã deploy stack với tên stack-demo. Sử dụng option -c để chỉ định file compose cho stack

List danh sách service của stack:

Như vậy là việc deploy stack đã hoàn tất, bây giờ ta có thể test app bằng curl

Nhờ có routing mesh mà ta có thể access app thông qua bất cứ node nào trong swarm.

Tiếp đến ta sẽ check xem các service này được deploy lên những node nào

Như vậy service redis-host được deploy lên node Worker1, service web được deploy lên node Manager. Tuy rằng 2 serivce được deploy lên 2 node khác nhau nhưng chúng vẫn có thể giao tiếp với nhau thông qua overlay network.

Chỉ định node cho service khi deploy

Mặc định, khi deploy một stack lên swarm, manager sẽ assign task của các service cho các node một cách random.

Có thể ở lần đầu tiên deploy, service redis-host được deploy lên node Worker1. Nhưng ở lần deploy tiếp theo có thể sẽ deploy lên node Worker2 hoặc Manager.

Trong thực tế, mỗi service sẽ yêu cầu cấu hình host khác nhau. VD: mysql yêu cầu tốc độ đọc/ghi ổ cứng cao, redis lại yêu cầu về RAM nhiều hơn.

Để giải quyết vấn đề này, docker cho phép ta chỉ định node để deploy service thông qua config placement.

Mình sẽ thay đổi một chút trong file docker-compose.yml

Ở đây mình mình config placement với rule như sau:

  • web: chỉ deploy lên node với role là worker và có gắn lable type=web-server
  • redis-host: chỉ deploy lên node với role là worker và có gắn lable name=redis-server

Tiếp đến mình sẽ gán lable cho 2 node worker:

  • Gán lable type cho node Woker1 với giá trị là web-server
  • Gán lable type cho node Woker2 với giá trị là redis-server

Trước khi deploy stack mới, hãy xóa stack ở ví dụ trước

Cuối cùng deploy stack mới lên và xem sự khác bọt

Như vậy các service đã được deploy lên đúng các node mà ta mong muốn. Còn rất nhiều các option để set placement cho các service trong một stack, các bạn có thể tìn hiểu thêm tại đây

Kết

Tới đây là đã kết thúc loạt bài về Docker swarm của mình. Hy vọng các kiến thức mà mình muốn truyền tải sẽ hữu ích cho mọi người.

Mong rằng sẽ nhận được ý kiến đóng góp từ mọi người nếu thấy còn điểm nào mình viết chưa đúng hoặc khó hiểu để mình có thể cải thiện trong các bài viết sau.


Nguyễn Thanh Sơn

Developer

Related Posts

Docker
[Docker swarm - P2] Tìm hiểu Docker swarm qua các ví dụ đơn giản
June 09, 2021
6 min
© 2021, All Rights Reserved.

Quick Links

Liên hệ quảng cáoThông tinLiên hệ

Social Media