Docker Compose: chạy web và database cùng lúc chỉ với một lệnh

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Ứng dụng thật hiếm khi chỉ có một thành phần: thường là web, database và có thể thêm cache. Khởi động từng container bằng tay rất mệt. Docker Compose cho phép mô tả tất cả trong một file và bật lên bằng một lệnh.

Compose là gì?

Docker Compose là công cụ định nghĩa và chạy nhiều container bằng file YAML, thường đặt tên compose.yaml hoặc docker-compose.yml. Mỗi dịch vụ (service) là một container, và Compose tự tạo mạng riêng để chúng gọi nhau theo tên.

Ví dụ: ứng dụng Node.js với PostgreSQL

services:
  web:
    build: .
    ports:
      - '3000:3000'
    environment:
      DATABASE_URL: postgres://app:secret@db:5432/appdb
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: appdb
    volumes:
      - dbdata:/var/lib/postgresql/data

volumes:
  dbdata:

Điểm đáng chú ý:

  • Dịch vụ web được dựng từ Dockerfile ở thư mục hiện tại (build: .).
  • Trong chuỗi kết nối, máy chủ database là db, chính là tên dịch vụ. Compose tự phân giải tên này.
  • Volume dbdata giữ dữ liệu lại khi container bị xóa và tạo lại.
  • Mật khẩu ở đây chỉ để học. Với dự án thật hãy dùng file .env hoặc secrets.

Các lệnh thường dùng

docker compose up -d
docker compose ps
docker compose logs -f web
docker compose exec db psql -U app appdb
docker compose down

Lệnh up -d dựng và chạy nền mọi dịch vụ. logs -f theo dõi nhật ký trực tiếp. exec chạy lệnh bên trong container đang chạy. down dừng và xóa container cùng mạng; thêm cờ -v nếu muốn xóa luôn volume, nhưng hãy cẩn thận vì dữ liệu sẽ mất.

depends_on chưa đủ để đảm bảo database sẵn sàng

Mặc định depends_on chỉ đảm bảo thứ tự khởi động, không đợi database nhận kết nối. Cách làm chuẩn là thêm healthcheck cho database rồi cho web chờ trạng thái khỏe:

  db:
    image: postgres:16
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U app -d appdb']
      interval: 5s
      timeout: 3s
      retries: 10
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy

Biến môi trường và file .env

Compose tự đọc file .env cạnh compose.yaml để thay thế biến dạng ${TEN_BIEN}. Nhờ vậy bạn không phải ghi mật khẩu thẳng vào file cấu hình được đẩy lên Git. Nhớ thêm .env vào .gitignore và cung cấp một file .env.example làm mẫu cho đồng đội.

Mẹo dùng Compose hiệu quả

  1. Dùng bind mount (ví dụ ./src:/app/src) khi phát triển để sửa code thấy ngay kết quả.
  2. Tách file cấu hình cho từng môi trường bằng compose.override.yaml.
  3. Đặt tên dịch vụ rõ nghĩa vì chúng chính là tên máy chủ nội bộ.
  4. Không công khai cổng database ra ngoài nếu chỉ cần web truy cập, hãy bỏ phần ports của dịch vụ đó.

Compose dùng ở đâu?

Compose rất hợp cho môi trường phát triển, kiểm thử tự động và các hệ thống nhỏ trên một máy chủ. Khi hệ thống cần chạy trên nhiều máy với khả năng tự phục hồi và mở rộng, người ta thường chuyển sang các nền tảng điều phối như Kubernetes, nhưng khái niệm bạn học ở Compose vẫn dùng lại được.

Kết luận

Chỉ với một file YAML và lệnh docker compose up, đồng đội mới vào dự án có thể dựng đầy đủ môi trường trong vài phút. Hãy thử gom ứng dụng đang làm của bạn vào Compose ngay hôm nay.

Nếu bạn muốn thực hành Compose cùng các dự án mẫu có hướng dẫn từng bước, hãy ghé qua các khóa học trên codebem.com.

author_photo
Nguyễn Đình Cường

0 comment