Nếu đã từng làm việc với kiến trúc Microservices hoặc quản lý nhiều container cùng lúc, chắc chắn bạn đã biết đến sức mạnh của Docker Compose. Thay vì phải gõ từng lệnh dài dòng để chạy từng container riêng lẻ, chúng ta gom tất cả cấu hình vào một tệp docker-compose.yml duy nhất.

Tuy nhiên, để thực sự làm chủ công cụ này, việc hiểu cách cấu hình file YAML là chưa đủ. Bạn cần nắm vững Docker Compose CLI (Command Line Interface) – công cụ giao tiếp trực tiếp để điều phối, quản lý và giám sát các dịch vụ.

Bài viết này sẽ "bóc tách" chi tiết về Docker Compose CLI, từ các biến môi trường cấu hình cho đến danh sách các lệnh không thể thiếu trong quá trình phát triển.

1. Tùy Biến Môi Trường Cho Compose CLI (Environment Variables)

Biến môi trường giúp bạn tinh chỉnh cách Docker Compose CLI hoạt động mà không cần phải can thiệp trực tiếp vào file code. Dưới đây là những biến quan trọng nhất bạn cần nắm:

  • COMPOSE_PROJECT_NAME: Xác định tên project và tiền tố cho tên container.

    • Ví dụ: Nếu biến này là myapp, các service dbweb sẽ tạo ra các container tương ứng là myapp_db_1myapp_web_1. Nếu không set, Compose sẽ lấy tên thư mục hiện tại làm tên mặc định.

  • COMPOSE_FILE: Chỉ định đường dẫn tới tệp cấu hình.

    • Mặc định, Compose sẽ tìm file docker-compose.yml. Bạn có thể chạy nhiều file bằng cách ngăn cách chúng bằng dấu hai chấm : (Ví dụ: COMPOSE_FILE=docker-compose.yml:docker-compose.prod.yml).

  • COMPOSE_API_VERSION: Giải quyết lỗi không khớp phiên bản giữa Docker Client và Server. Tuy nhiên, đây chỉ là giải pháp tạm thời; về lâu dài bạn nên nâng cấp Client/Server cho đồng nhất để tránh mất tính năng.

  • DOCKER_HOST: Chỉ định URL của Docker daemon (Mặc định là unix:///var/run/docker.sock).

  • Các cấu hình về TLS / Security:

    • DOCKER_TLS_VERIFY: Bật giao tiếp TLS.

    • DOCKER_CERT_PATH: Trỏ đến thư mục chứa các tệp chứng chỉ (ca.pem, cert.pem, key.pem). Mặc định là ~/.docker.

    • COMPOSE_TLS_VERSION: Cấu hình phiên bản TLS (TLSv1, TLSv1_1, TLSv1_2).

  • Các cấu hình khác:

    • COMPOSE_HTTP_TIMEOUT: Thời gian chờ tối đa cho request (Mặc định 60 giây).

    • COMPOSE_IGNORE_ORPHANS: Set bằng true hoặc 1 để bỏ qua các container bị lỗi không liên quan đến project hiện tại.

    • COMPOSE_PARALLEL_LIMIT: Số lượng thao tác tối đa chạy song song (Mặc định: 64).

    • COMPOSE_CONVERT_WINDOWS_PATHS / COMPOSE_FORCE_WINDOWS_HOST: Các cờ hỗ trợ tương thích đường dẫn khi làm việc trên môi trường Windows.

2. Kích Hoạt Command-Line Completion (Tự Động Hoàn Thành Lệnh)

Việc gõ từng lệnh đôi khi mất thời gian và dễ sai sót. Tương tự như Git, bạn có thể cài đặt Command-line completion để Terminal tự động gợi ý các lệnh và tham số của Docker Compose.

Nếu bạn đang sử dụng Zsh, plugin này đã được tích hợp sẵn. Bạn chỉ cần mở file ~/.zshrc và thêm docker cùng docker-compose vào danh sách plugins:

plugins=(
  ...
  docker
  docker-compose
)

3. Cẩm Nang Các Lệnh Docker Compose CLI Thiết Yếu

Để dễ nhớ, chúng ta có thể chia các lệnh CLI thành các nhóm tác vụ chính:

Nhóm Quản Lý Vòng Đời Dịch Vụ (Lifecycle Management)

  • docker-compose up: Lệnh quyền lực nhất. Lệnh này sẽ build, (tạo lại), khởi động và đính kèm (attach) vào các container của toàn bộ services.

    • Tip: Thường kết hợp với cờ -d (docker-compose up -d) để chạy ngầm dưới background.

  • docker-compose down: Trái ngược với up. Lệnh này sẽ dọn dẹp hệ thống bằng cách dừng và xóa tất cả containers, networks, volumes (mặc định) và images được tạo bởi lệnh up.

  • docker-compose start / stop: Chỉ khởi động hoặc dừng các container đã được tạo sẵn mà không xóa chúng.

  • docker-compose restart: Khởi động lại container. Lưu ý: Nếu bạn thay đổi file docker-compose.yml, lệnh này sẽ không cập nhật cấu hình mới. Bạn phải dùng lệnh up lại.

  • docker-compose pause / unpause: Tạm dừng hoặc tiếp tục chạy một service.

  • docker-compose kill: Ép buộc dừng ngay lập tức một container (Gửi tín hiệu SIGKILL).

  • docker-compose rm: Xóa hẳn các container đã bị stop.

Nhóm Xây Dựng & Triển Khai (Build & Deploy)

  • docker-compose build: Tiến hành build (đóng gói) lại các services dựa trên Dockerfile.

    • Nên chạy lệnh này mỗi khi có sự thay đổi trong code hoặc Dockerfile. Container được tạo ra sẽ có tag dạng project_service (ví dụ: myapp_mysql).

  • docker-compose pull: Tải về image đã được khai báo trong file cấu hình mà không khởi động container.

  • docker-compose push: Đẩy (push) image do bạn tự build ở local lên các registry/repository (cần đảm bảo bạn có quyền truy cập).

Nhóm Gỡ Lỗi & Giám Sát (Inspect & Debug)

  • docker-compose ps: Liệt kê danh sách các container thuộc project hiện tại và trạng thái của chúng.

  • docker-compose logs: Hiển thị luồng log của các services. Thêm cờ -f (--follow) để stream log realtime giống như lệnh tail -f.

  • docker-compose exec: Tương đương với docker exec. Dùng để thực thi một lệnh bên trong một container đang chạy.

    • Ví dụ: docker-compose exec web sh để truy cập vào shell của service web.

  • docker-compose run: Khởi động một service và chạy một lệnh một lần (one-off command).

    • Ví dụ: docker-compose run web bash.

  • docker-compose top: Hiển thị các tiến trình (processes) đang thực thi bên trong container.

  • docker-compose port: Liệt kê các port công khai (public) đã được mapping với private port của container.

  • docker-compose config: Hỗ trợ validate (kiểm tra lỗi cú pháp) và hiển thị toàn bộ nội dung cấu hình Compose file của bạn.

  • docker-compose events: Lắng nghe và stream các sự kiện (events) đang diễn ra trong project.

Lưu ý nhỏ: Các lệnh như docker-compose createdocker-compose scale hiện tại đã không còn hiệu lực (deprecated) ở các phiên bản mới. Hãy sử dụng docker-compose up --no-start hoặc docker-compose up --scale để thay thế.

Việc thao tác thành thạo Docker Compose CLI sẽ giúp bạn tăng tốc độ luân chuyển môi trường phát triển (từ dev lên staging, production) lên rất nhiều lần. Đừng chỉ ghi nhớ, hãy mở Terminal lên, tự cấu hình một cụm Node.js hay PHP đi kèm cơ sở dữ liệu và trực tiếp trải nghiệm các lệnh này nhé!