Docker Compose cho phát triển microservice cục bản

Docker Compose cho phát triển microservice cục bản

Docker Compose là công cụ giúp bạn khởi chạy toàn bộ stack microservice bằng một lệnh duy nhất từ file docker-compose.yml. Thay vì chạy từng container riêng lẻ, Compose tự động quản lý service, mạng và ổ cứng sống cho môi trường phát triển đồng nhất. Bài viết này hướng dẫn cách cấu hình một stack gồm API, PostgreSQL, Redis và Adminer chỉ trong vài phút.

Docker Compose làm gì trong dev?

Docker Compose (còn gọi là docker compose trên CLI hiện đại) đọc file YAML cấu hình và biến .env, sau đó tạo và khởi chạy tất cả container trong stack. Mỗi service có thể dùng build: (từ Dockerfile) hoặc image: (từ registry). Compose tự động tạo một mạng bridge để các service giao tiếp với nhau qua tên service, đảm bảo môi trường dev giống hệt CI và production. Bạn không cần viết script bash phức tạp để khởi động nhiều container — một lệnh docker compose up thay thế toàn bộ quy trình đó.

Một trong những lợi ích chính là tính nhất quán giữa môi trường. Mỗi thành viên trong team dùng cùng cấu hình, cùng phiên bản database, cùng biến môi trường — không còn lỗi “trên máy tôi chạy được”. Kết hợp với healthcheck, Compose đảm bảo service phụ chạy sẵn trước service chính, loại bỏ race condition phổ biến khi API kết nối database chưa sẵn sàng.

Sơ đồ kiến trúc Docker Compose: các service API, database, Redis nối tiếp trên một mạng bridge

Ví dụ docker-compose.yml microservice dev

Dưới đây là một file cấu hình hoàn chỉnh cho môi trường dev gồm API (build từ source), PostgreSQL, Redis và Adminer (chỉ chạy khi dùng profile dev):

services:
  api:
    build: .
    env_file: .env
    ports:
      - "8000:8000"
    depends_on:
      db:
        condition: service_healthy
    develop:
      watch:
        - action: sync
          path: ./src
          target: /app/src
        - action: rebuild
          path: .
    profiles: ["dev"]

  db:
    image: postgres:16
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD:-secret}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3

  adminer:
    image: adminer
    profiles: ["dev"]
    ports:
      - "8080:8080"

volumes:
  db_data:

develop.watch cho phép live-sync code khi thay đổi file — rất tiện cho TDD. profiles: ["dev"] tách tooling (Adminer) ra khỏi service chính, tránh câu lạc quan tài nguyên.

Quản lý mạng và volume

Mặc định Compose tạo một mạng bridge. Các service chỉ cần gọi tên service để kết nối. Để kiểm soát chi tiết, bạn khai báo riêng:

services:
  api:
    networks:
      - backend
  db:
    networks:
      - backend

networks:
  backend:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16

Terminal chạy lệnh docker compose up, liệt kê container khởi động

Volume để dữ liệu sống tún

Dùng named volume để persistent data — ngay cả khi xóa container, dữ liệu volume vẫn còn. Đây là cách đề xuất trong hướng dẫn gettingstarted của Docker:

volumes:
  db_data:

Multi-file cấu hình môi trường

Compose tự động gộp -f theo thứ tự. Quy ước chuẩn: compose.yaml (chính) + compose.override.yaml (dev) + compose.prod.yaml (prod). Đây là best practice để môi trường đồng nhất từ dev tới production. Bạn có thể tách tooling ra khỏi service chính bằng profiles — ví dụ: service không có profiles luôn chạy, còn service có profiles: ["debug"] chỉ chạy khi bạn chỉ định docker compose --profile debug up.

File compose.override.yaml thường chứa các thay đổi cho môi trường dev như mounts để live-reload, ports mở rộng, hoặc service phụ như Adminer, Mailhog. Khi deploy production, bạn dùng docker compose -f compose.yaml -f compose.prod.yml up -d, giữ lại chỉ các thành phần cần thiết. Lưu ý: override files luôn được áp dụng tự động khi không có -f — đây là hành vi mặc định của Compose.

Lệnh thường dùng

Lệnh Công dụ
docker compose up -d Khởi động background
docker compose down -v Dừng + xóa volume
docker compose --profile dev up Chạy service theo profile
docker compose logs -f api Xem log realtime
docker compose build Build lại image

Với .env + interpolation (${VAR:-default}), bạn tránh hard-code secret và commit an toàn file cấu hình lên Git. Luôn thêm .env.dockerignore vào .gitignore.

Kết luận

Docker Compose là lựa chọn lý tưởng để phát triển microservice cục bản: một lệnh, toàn bộ stack chạy đồng thời, code tự đồng sync, dữ liệu sống tún và profile tách tooling. Kết hợp healthcheck để tránh race condition, named volume để persistent data, và multi-file compose để môi trường dev-prod nhất quán.

Đừng quên thêm .dockerignore để loại bỏ .env, node_modules, .git ra khỏi build context — tránh đưa secret vào image layer. Dùng .env + interpolation (${VAR:-default}) để tránh hard-code trong file compose. Đây là những best practice giúp bạn tận dụng tối đa Docker Compose mà không gặp vấn đề bảo mật.

Lời nhắn docker compose ps liệt kê các service đang healthy

Chi tiết tham khảo tại docs.docker.com/composecompose-file reference.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Git internals: thư mục .git hoạt động như thế nào

Git là công cụ quản lý phiên bản phổ biến nhất, nhưng nhiều developer chỉ dùng các lệnh bề mặt như git add, git commit, git push. Hiểu bên trong…

Xem thêm

HTMX framework — Thư viện HTML-driven cho ứng dụng web hiện đại

HTMX framework HTMX là thư viện JavaScript nhẹ, không phụ thuộc build tool, cho phép truy cập AJAX, CSS Transitions, WebSockets và Server Sent Events trực tiếp qua thuộc tính…

Xem thêm

Event-Driven Architecture: Kafka, RabbitMQ, Apache Pulsar

Event-Driven Architecture là gì? Event-Driven Architecture (EDA) là kiến trúc phần mềm xây dựng xung quanh sự kiện — các thay đổi trạng thái trong hệ thống được phát hiện,…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất