Đâ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
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:
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.
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
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:
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
.
Đoạn code python xử lý công việc sau:
Hello World! I have been seen x times.
, với x là số lần user access webpageredis-host
.File list các dependencies của python app
Đây là file dùng để build image cho python app của chúng ta
Đâ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 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
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
.
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:
type
cho node Woker1
với giá trị là web-server
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
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.
Quick Links
Social Media