Thứ Năm, 21 tháng 8, 2025

Bài 7: Container Hóa Microservices Với Docker

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

Docker

Ở 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.

  1. Mở terminal và chạy các lệnh sau để cài Docker:
    sudo apt update
    sudo apt install -y docker.io
  2. 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
  3. 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.

  4. 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.

  5. 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).

  1. 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).

  2. Tạo file Dockerfile trong thư mục menu-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 file package.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ó:

  1. 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.
  2. Kiểm tra image vừa tạo:
    docker images

    Bạn sẽ thấy menu-service trong danh sách.

  3. 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:

  1. Kiểm tra container đang chạy:
    docker ps

    Bạn sẽ thấy menu-container trong danh sách.

  2. 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.

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é!

=============================
Website không 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 không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database 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ộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó 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/admin_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

=============================
AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, 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