Danh sách bài viết trong series Học microservice cơ bản
- Bài 1: Microservices Là Gì?
- Bài 2: Chuẩn Bị Môi Trường Để Học Microservices
- Bài 3: Viết Microservice Đầu Tiên
- Bài 4: Microservices Và Monolith
- Bài 5: Giao Tiếp Giữa Microservices
- Bài 6: Giao Tiếp Nâng Cao Trong Microserivce với RabbitMQ
- Bài 7: Container Hóa Microservices Với Docker
- Bài 8: Quản Lý Nhiều Microservices Với Docker Compose
- Bài 9: Học microservices cơ bản với minikube
Bài 8: Quản Lý Nhiều Microservices Với Docker Compose
Ở bài trước, bạn đã học cách container hóa Menu Service
với Docker – một bước tiến lớn trong hành trình học microservices. Nhưng nếu bạn có nhiều microservices (như Menu Service
, Order Service
, và RabbitMQ), việc chạy từng container một sẽ rất mất thời gian. Hôm nay, mình sẽ giới thiệu một công cụ giúp bạn quản lý và chạy nhiều microservices cùng lúc: Docker Compose. Mình nhớ lúc mới học Docker Compose, mình thấy nó như một “trợ lý” giúp mình điều phối mọi thứ dễ dàng hơn. Mình sẽ hướng dẫn bạn từng bước để chạy ba microservices cùng lúc, và giải thích mọi thứ thật rõ ràng. Sẵn sàng chưa nào?
Docker Compose Là Gì? Hãy Nghĩ Về Việc Điều Phối Nhiều Nhân Viên Trong Quán
Trước tiên, mình muốn bạn hiểu Docker Compose là gì một cách đơn giản. Hãy quay lại ví dụ quán ăn mà chúng ta đã dùng ở các bài trước. Giả sử bạn có ba nhân viên: một người làm món ăn (Menu Service), một người nhận đơn hàng (Order Service), và một người chuyển tin nhắn giữa các bộ phận (RabbitMQ). Nếu bạn phải gọi từng người và chỉ dẫn riêng lẻ, sẽ rất mất thời gian. Thay vào đó, bạn viết một kế hoạch chung: “Mọi người làm việc cùng lúc, người này làm món, người kia nhận đơn, và người còn lại chuyển tin.” Docker Compose cũng giống như kế hoạch đó: nó giúp bạn chạy và quản lý nhiều container (microservices) cùng lúc, chỉ với một lệnh duy nhất.
Nói kỹ thuật hơn, Docker Compose là một công cụ dùng file YAML (docker-compose.yml
) để định nghĩa và chạy nhiều container. Bạn chỉ cần viết file này, rồi dùng một lệnh để khởi động toàn bộ hệ thống.
Bước 1: Cài Đặt Docker Compose Trên Máy Của Bạn
Hãy bắt đầu bằng cách cài Docker Compose trên Ubuntu. Nếu bạn chưa cài Docker (từ bài 7), hãy quay lại bài trước để cài trước nhé.
- Mở terminal và chạy lệnh sau để tải Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- Cấp quyền thực thi cho file vừa tải:
sudo chmod +x /usr/local/bin/docker-compose
- Kiểm tra xem Docker Compose đã cài thành công chưa:
docker-compose --version
Nếu bạn thấy kết quả như
Docker Compose version v2.20.0
, Docker Compose đã sẵn sàng.
Bước 2: Chuẩn Bị Các Microservices
Chúng ta sẽ chạy ba microservices cùng lúc: Menu Service
, Order Service
, và RabbitMQ (từ bài 5 và 6). Hãy đảm bảo bạn có các thư mục sau:
- Menu Service (từ bài 5): Đã có
app.js
,package.json
, vàDockerfile
(từ bài 7). - Order Service (từ bài 6): Gửi message vào RabbitMQ.
- RabbitMQ: Sẽ chạy qua image có sẵn từ Docker Hub.
Nếu bạn chưa có, hãy quay lại các bài trước để tạo. Dưới đây là cấu trúc thư mục mình gợi ý:
microservices/
├── menu-service/
│ ├── app.js
│ ├── package.json
│ └── Dockerfile
└── order-service/
├── app.js
├── package.json
└── Dockerfile
Bước 3: Tạo Dockerfile Cho Order Service
Menu Service
đã có Dockerfile
từ bài 7, giờ chúng ta cần tạo Dockerfile
cho Order Service
:
- Di chuyển vào thư mục
order-service
:cd order-service
- Tạo file
Dockerfile
:touch Dockerfile
Mở file
Dockerfile
trong VS Code (code Dockerfile
) và dán nội dung sau:FROM node:18 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3002 CMD ["node", "app.js"]
Bước 4: Tạo File Docker Compose
Bây giờ, chúng ta sẽ tạo file docker-compose.yml
để chạy cả ba microservices cùng lúc.
- Tạo một thư mục chung (nếu chưa có) và di chuyển vào đó:
mkdir microservices cd microservices
Đảm bảo thư mục
menu-service
vàorder-service
đã nằm trongmicroservices/
. -
Tạo file
docker-compose.yml
:touch docker-compose.yml
Mở file
docker-compose.yml
trong VS Code (code docker-compose.yml
) và dán nội dung sau:version: '3' services: menu-service: build: ./menu-service ports: - "3001:3001" container_name: menu-container order-service: build: ./order-service ports: - "3002:3002" container_name: order-container depends_on: - rabbitmq rabbitmq: image: rabbitmq:3-management ports: - "5672:5672" - "15672:15672" container_name: rabbitmq-container
Giải thích file:
menu-service
vàorder-service
: Build container từDockerfile
trong thư mục tương ứng.rabbitmq
: Dùng image có sẵn từ Docker Hub (rabbitmq:3-management
), với cổng 5672 (cho message queue) và 15672 (cho giao diện quản lý).depends_on
: Đảm bảo RabbitMQ chạy trướcOrder Service
.
Bước 5: Chạy Hệ Thống Với Docker Compose
Đã đến lúc chạy toàn bộ hệ thống:
- Trong thư mục
microservices
, chạy lệnh:docker-compose up -d
-d
: Chạy ở chế độ nền. Nếu thành công, Docker Compose sẽ build và chạy ba container:menu-container
,order-container
, vàrabbitmq-container
.
- Kiểm tra các container đang chạy:
docker ps
Bạn sẽ thấy ba container trong danh sách.
Bước 6: Kiểm Tra Hệ Thống
Hãy kiểm tra xem các microservices có hoạt động đúng không:
- Kiểm tra
Menu Service
:- Mở Postman, tạo request
GET
với URL:http://localhost:3001/menu
. - Nhấn “Send”, bạn sẽ thấy:
[ { "id": 1, "name": "Phở bò", "price": 50000 }, { "id": 2, "name": "Bún chả", "price": 40000 }, { "id": 3, "name": "Cơm tấm", "price": 35000 } ]
- Mở Postman, tạo request
- Kiểm tra RabbitMQ:
- Mở trình duyệt, truy cập:
http://localhost:15672
. - Đăng nhập với username:
guest
, password:guest
. - Bạn sẽ thấy giao diện RabbitMQ.
- Mở trình duyệt, truy cập:
- Kiểm tra
Order Service
:- Mở Postman, tạo request
POST
với URL:http://localhost:3002/order
. - Chọn tab “Body”, chọn “raw”, nhập JSON:
{}
. - Nhấn “Send”, bạn sẽ thấy:
Đơn hàng đã được gửi để xử lý
.
- Mở Postman, tạo request
Câu Hỏi Trắc Nghiệm: Kiểm Tra Hiểu Biết Của Bạn
Hãy thử trả lời vài câu hỏi để xem bạn đã nắm được chưa nhé:
-
Docker Compose dùng để làm gì?
A. Chạy một container duy nhất
B. Quản lý và chạy nhiều container cùng lúc
Đáp án: B. Quản lý và chạy nhiều container cùng lúc. -
File
docker-compose.yml
được viết bằng ngôn ngữ nào?
A. JSON
B. YAML
Đáp án: B. YAML. -
Nếu RabbitMQ không chạy,
Order Service
có hoạt động không?
A. Có, nhưng phần gửi message sẽ lỗi
B. Không, toàn bộ hệ thống sẽ dừng
Đáp án: A. Có, nhưng phần gửi message sẽ lỗi.
Kết Thúc: Bạn Đã Chạy Được Nhiều Microservices Cùng Lúc
Hôm nay, bạn đã học cách dùng Docker Compose để chạy nhiều microservices cùng lúc – một kỹ năng rất hữu ích. Bạn đã khởi động Menu Service
, Order Service
, và RabbitMQ chỉ với một lệnh. Ở bài tiếp theo, chúng ta sẽ học cách triển khai microservices lên Kubernetes, để bạn có thể chạy hệ thống trên một môi trường lớn hơn. Hẹn gặp bạn ở bài sau nhé!