Thứ Tư, 25 tháng 10, 2023

Deploy ứng dụng load balancer sử dụng Nginx với Docker

Mục lục nội dung

  1. Ứng dụng ví dụ
    1. Nginx


Khi chạy ứng dụng, chúng ta sẽ take a look vào Console của Docker Compose để biết là request đang được forward tới container nào.

Hãy build lại Docker Image cho ứng dụng ví dụ của chúng ta các bạn nhé!

Cấu hình của ứng dụng ví dụ cho 3 container tương ứng với 3 services trong tập tin docker-compose.yml, trong bài viết Giới thiệu về Docker Compose  sẽ như sau:

spring_boot_docker_compose_1:
image: spring-boot-docker-compose
container_name: spring_boot_docker_compose_1
depends_on:
- postgresql
environment:
DATABASE_USERNAME: "khanh"
DATABASE_PASSWORD: "123456"
DATABASE_HOST: "postgresql"
DATABASE_NAME: "test"
DATABASE_PORT: 5432
ports:
- 8081:8080
networks:
- huongdanjava

spring_boot_docker_compose_2:
image: spring-boot-docker-compose
container_name: spring_boot_docker_compose_2
depends_on:
- postgresql
environment:
DATABASE_USERNAME: "khanh"
DATABASE_PASSWORD: "123456"
DATABASE_HOST: "postgresql"
DATABASE_NAME: "test"
DATABASE_PORT: 5432
ports:
- 8082:8080
networks:
- huongdanjava

spring_boot_docker_compose_3:
image: spring-boot-docker-compose
container_name: spring_boot_docker_compose_3
depends_on:
- postgresql
environment:
DATABASE_USERNAME: "khanh"
DATABASE_PASSWORD: "123456"
DATABASE_HOST: "postgresql"
DATABASE_NAME: "test"
DATABASE_PORT: 5432
ports:
- 8083:8080
networks:
- huongdanjava

Mỗi container sẽ expose port khác nhau bao gồm: 8081, 8082 và 8083.
Cấu hình của PostgreSQL database trong tập tin docker-compose.yaml, không đổi các bạn nhé!

Nginx

Trước khi đi vào chi tiết cấu hình load balancer với Nginx như thế nào, chúng ta sẽ điểm sơ qua một số thuật toán được sử dụng để hiện thực load balancer các bạn nhé! Chúng ta có một số thuật toán cơ bản sau:

  • Round Robin: các request từ người dùng sẽ được forward lần lượt đến tất cả các máy theo thứ tự. Có nghĩa là ứng dụng của chúng ta được deploy lên bao nhiêu máy thì request của người dùng sẽ lần lượt được forward đến tất cả các máy này. Request đầu tiên sẽ vào máy 1, request thứ 2 sẽ vào máy 2, … sau khi máy cuối cùng được sử dụng thì request tiếp theo sẽ vào máy 1.
  • Weighted Round Robin: tương tự như thuật toán Round Robin nhưng các máy deploy ứng dụng sẽ có cấu hình khác nhau. Máy nào có cấu hình cao hơn sẽ được đánh trọng số cao hơn và nhận được nhiều request hơn các bạn nhé!
  • Dynamic Round Robin: thuật toán này giống như Weighted Round Robin nhưng có sự khác biệt là trọng số của các máy sẽ không cố định. Cấu hình của các máy sẽ được kiểm tra liên tục, do đó trọng số sẽ thay đổi liên tục.
  • Fastest: thuật toán này dựa vào thời gian response của máy trong setup load balancer. Máy nào có thời gian response nhanh hơn sẽ được chọn để forward request.
  • Least Connections: máy nào có ít kết nối nhất sẽ được forward request tới.

Trong bài viết này, mình sẽ sử dụng thuật toán Round Robin với Nginx để làm ví dụ các bạn nhé!

Mình sẽ build một custom Nginx Docker image với Dockerfile có nội dung như sau:

FROM nginx:latest

RUN rm /etc/nginx/conf.d/default.conf

COPY nginx.conf /etc/nginx/conf.d/default.conf

trong đó, tập tin nginx.conf có nội dung như sau:

upstream apps {
server 172.17.0.1:8081;
server 172.17.0.1:8082;
server 172.17.0.1:8083;
}

server {
location / {
proxy_pass http://apps;
}
}

Trong tập tin nginx.conf trên, mình đã sử dụng reverse proxy của Nginx với directive upstream để hiện thực load balancer. Khi một request từ người dùng đến, request này sẽ được forward một trong 3 server được khai báo bên trong directive upstream này. Mặc định thì Nginx hỗ trợ thuật toán round-robin nên các bạn không cần khai báo gì thêm ngoài thông tin của 3 server.

Cũng cần nói thêm là khi start các container 172.17.0.1 là địa chỉ IP mặc định khi các container được start, nên như các bạn thấy, mình sử dụng 172.17.0.1 cho 3 container của ứng dụng ví dụ, với các port khác nhau như đã khai báo trong tập tin docker-compose.yaml.

Các bạn cần build custom Docker image này bằng câu lệnh sau:

docker build -t nginx:0.0.1 .

Kết quả:

Sau khi đã có Docker Image của Nginx, các bạn có thể khai báo một service cho Nginx trong tập tin docker-compose.yaml như sau:

nginx:
image: nginx:0.0.1
ports:
- 80:80

Đến đây thì chúng ta đã hoàn thành việc cấu hình để deploy load balancer cho ứng dụng ví dụ của chúng ta. Nội dung của tập tin docker-compose.yaml lúc này như sau:

version: '3.8'

services:
postgresql: 
image: postgres:13.3
container_name: postgres
restart: on-failure:5
environment:
POSTGRES_PASSWORD: "123456"
POSTGRES_USER: "khanh"
POSTGRES_DB: "test"
volumes:
- /Users/khanh/data:/var/lib/postgresql/data
ports:
- 5432:5432
networks:
- huongdanjava

spring_boot_docker_compose_1:
image: spring-boot-docker-compose
container_name: spring_boot_docker_compose_1
depends_on:
- postgresql
environment:
DATABASE_USERNAME: "khanh"
DATABASE_PASSWORD: "123456"
DATABASE_HOST: "postgresql"
DATABASE_NAME: "test"
DATABASE_PORT: 5432
ports:
- 8081:8080
networks:
- huongdanjava

spring_boot_docker_compose_2:
image: spring-boot-docker-compose
container_name: spring_boot_docker_compose_2
depends_on:
- postgresql
environment:
DATABASE_USERNAME: "khanh"
DATABASE_PASSWORD: "123456"
DATABASE_HOST: "postgresql"
DATABASE_NAME: "test"
DATABASE_PORT: 5432
ports:
- 8082:8080
networks:
- huongdanjava

spring_boot_docker_compose_3:
image: spring-boot-docker-compose
container_name: spring_boot_docker_compose_3
depends_on:
- postgresql
environment:
DATABASE_USERNAME: "khanh"
DATABASE_PASSWORD: "123456"
DATABASE_HOST: "postgresql"
DATABASE_NAME: "test"
DATABASE_PORT: 5432
ports:
- 8083:8080
networks:
- huongdanjava

nginx:
image: nginx:0.0.1
ports:
- 80:80

networks:
huongdanjava:
driver: bridge

Chạy tập tin này với docker compose up, các bạn sẽ thấy kết quả như sau:
Lúc này, nếu các bạn request tới http://localhost/hello lần thứ nhất, các bạn sẽ thấy Console của Docker Compose có kết quả như sau:

Container spring_boot_docker_compose_1 đã handle request này.

Lần thứ 2:

Lần này thì container spring_boot_docker_compose_2 handle request.
Lần thứ 3:

Và lần thứ tư sẽ quay lại spring_boot_docker_compose_1:

Đúng như expectation của chúng ta rồi đó các bạn!

=============================
Website không bao giờ chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn muốn tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ kinh nghiệm, thủ tục, quy trình, bí kíp thực chiến mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin1_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master