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 7: Container Hóa Microservices Với Docker: Bước Đầu Tiên

Ở bài trước, bạn đã học cách microservices giao tiếp bất đồng bộ qua RabbitMQ – một bước tiến lớn đấy! Hôm nay, chúng ta sẽ tìm hiểu một công cụ rất quan trọng trong thế giới microservices: Docker. Mình nhớ lúc mới học Docker, mình hơi lo lắng vì không biết container là gì và nó hoạt động ra sao. Nhưng sau khi làm thử, mình thấy nó giúp việc chạy microservices dễ dàng hơn rất nhiều. Mình sẽ hướng dẫn bạn từng bước để container hóa microservice đầu tiên – cụ thể là Menu Service
mà bạn đã tạo ở bài 5. Mọi thứ sẽ được giải thích thật rõ ràng để bạn dễ theo dõi. Sẵn sàng chưa nào?
Docker Là Gì? Hãy Nghĩ Về Việc Đóng Gói Đồ Ăn Để Giao
Trước tiên, mình muốn bạn hiểu Docker là gì một cách đơn giản. Hãy tưởng tượng bạn làm ở một quán ăn và cần giao đồ ăn cho khách. Thay vì giao từng món riêng lẻ (cơm, canh, thịt), bạn đóng gói tất cả vào một hộp: cơm, canh, thịt, và cả muỗng đũa. Hộp này (container) chứa mọi thứ cần thiết để khách có thể ăn ngay, và bạn có thể giao nó đến bất kỳ đâu mà không lo thiếu thứ gì.
Trong công nghệ, Docker cũng làm việc tương tự: nó “đóng gói” microservice của bạn (code, thư viện, cấu hình) vào một container. Container này có thể chạy trên bất kỳ máy nào có Docker, mà không cần lo về việc cài đặt lại môi trường (VD: Node.js, Express). Điều này rất hữu ích khi bạn có nhiều microservices, vì mỗi microservice có thể chạy trong container riêng, không xung đột với nhau.
Bước 1: Cài Đặt Docker Trên Máy Của Bạn
Hãy bắt đầu bằng cách cài Docker trên Ubuntu. Nếu bạn dùng Windows hoặc Mac, các bước cũng tương tự, nhưng mình sẽ tập trung vào Ubuntu để bạn dễ theo dõi.
- Mở terminal và chạy các lệnh sau để cài Docker:
sudo apt update sudo apt install -y docker.io
- Khởi động Docker và đảm bảo nó chạy tự động khi khởi động máy:
sudo systemctl enable docker sudo systemctl start docker
- Kiểm tra xem Docker đã cài thành công chưa:
docker --version
Nếu bạn thấy kết quả như
Docker version 20.10.7
, Docker đã sẵn sàng. - Thêm user của bạn vào nhóm Docker để không cần dùng
sudo
mỗi lần chạy lệnh:sudo usermod -aG docker $USER
Sau đó, đăng xuất và đăng nhập lại Ubuntu (hoặc khởi động lại máy) để áp dụng thay đổi.
- Kiểm tra lại bằng cách chạy:
docker run hello-world
Nếu bạn thấy thông điệp “Hello from Docker!”, Docker đã hoạt động tốt.
Bước 2: Container Hóa Menu Service
Bây giờ, chúng ta sẽ container hóa Menu Service
mà bạn đã tạo ở bài 5. Nếu bạn chưa có, hãy quay lại bài 5 để tạo nó trước (hoặc làm theo code bên dưới).
-
Di chuyển vào thư mục
menu-service
:cd menu-service
Đảm bảo bạn có file
app.js
với nội dung:const express = require('express'); const app = express(); const menu = [ { id: 1, name: 'Phở bò', price: 50000 }, { id: 2, name: 'Bún chả', price: 40000 }, { id: 3, name: 'Cơm tấm', price: 35000 } ]; app.get('/menu', (req, res) => { res.json(menu); }); app.listen(3001, () => { console.log('Menu Service chạy trên cổng 3001'); });
Và file
package.json
đã có Express (npm install express
nếu chưa cài). -
Tạo file
Dockerfile
trong thư mụcmenu-service
(không có đuôi file):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 3001 CMD ["node", "app.js"]
Giải thích Dockerfile:
FROM node:18
: Dùng image Node.js phiên bản 18 làm nền tảng.WORKDIR /app
: Tạo thư mục/app
trong container để chứa code.COPY package*.json ./
: Sao chép filepackage.json
vào container.RUN npm install
: Cài các thư viện (Express).COPY . .
: Sao chép toàn bộ code vào container.EXPOSE 3001
: Mở cổng 3001 (cổng màMenu Service
chạy).CMD ["node", "app.js"]
: Lệnh chạy microservice.
Bước 3: Build Và Chạy Container
Đã đến lúc “đóng gói” Menu Service
vào container và chạy nó:
- Build image từ
Dockerfile
:docker build -t menu-service .
-t menu-service
: Đặt tên image làmenu-service
..
: Build từ thư mục hiện tại (nơi cóDockerfile
). Nếu thành công, bạn sẽ thấy thông báo hoàn tất build.
- Kiểm tra image vừa tạo:
docker images
Bạn sẽ thấy
menu-service
trong danh sách. - Chạy container từ image:
docker run -d -p 3001:3001 --name menu-container menu-service
-d
: Chạy container ở chế độ nền.-p 3001:3001
: Ánh xạ cổng 3001 của container ra cổng 3001 của máy.--name menu-container
: Đặt tên container làmenu-container
.menu-service
: Tên image.
Bước 4: Kiểm Tra Microservice Trong Container
Hãy kiểm tra xem microservice có chạy đúng không:
- Kiểm tra container đang chạy:
docker ps
Bạn sẽ thấy
menu-container
trong danh sách. - Dùng Postman để test API:
- Tạo request
GET
với URL:http://localhost:3001/menu
. - Nhấn “Send”, bạn sẽ thấy kết quả:
[ { "id": 1, "name": "Phở bò", "price": 50000 }, { "id": 2, "name": "Bún chả", "price": 40000 }, { "id": 3, "name": "Cơm tấm", "price": 35000 } ]
Nếu bạn thấy kết quả này, xin chúc mừng! Bạn đã container hóa thành công
Menu Service
.
- Tạo request
Checklist Docker: Kiểm Tra Trước Khi Kết Thúc
Hãy kiểm tra xem bạn đã làm đúng các bước chưa:
- [ ] Docker đã cài và chạy được (
docker run hello-world
). - [ ] Image
menu-service
đã build thành công (docker images
). - [ ] Container
menu-container
đang chạy (docker ps
). - [ ] API
/menu
trả về danh sách món ăn qua Postman.
Nếu có bước nào chưa làm được, bạn có thể làm lại theo hướng dẫn, hoặc hỏi mình nhé.
Kết Thúc: Bạn Đã Container Hóa Được Microservice Đầu Tiên
Hôm nay, bạn đã học cách dùng Docker để container hóa microservice – một kỹ năng rất quan trọng. Bạn đã “đóng gói” Menu Service
vào container và chạy nó thành công. Ở bài tiếp theo, chúng ta sẽ học cách chạy nhiều microservices cùng lúc bằng Docker Compose, để bạn có thể quản lý chúng dễ dàng hơn. Hẹn gặp bạn ở bài sau nhé!