Hướng dẫn Toàn diện về Docker Compose

Đừng chạy các lệnh Docker thủ công cho từng dịch vụ nữa.

Nếu bạn đang vận hành một ứng dụng hiện đại, có thể bạn sẽ có frontend, backend, cơ sở dữ liệu và bộ nhớ đệm (cache). Việc chạy từng thành phần một rất chậm và dễ xảy ra lỗi.

Docker Compose giải quyết vấn đề này. Bạn định nghĩa toàn bộ stack của mình trong một tệp YAML duy nhất và khởi chạy mọi thứ chỉ với một câu lệnh.

Các khái niệm cơ bản

  • Không có Compose: Bạn phải chạy bốn lệnh riêng biệt cho bốn container.
  • Có Compose: Bạn chỉ cần chạy docker compose up và mọi thứ sẽ khởi động.

Các khái niệm quan trọng

• Services: Mỗi service đại diện cho một container. Bạn có thể dùng build cho mã nguồn của riêng mình hoặc image cho các công cụ đã được xây dựng sẵn như PostgreSQL hoặc Redis. • Port Mapping: Sử dụng định dạng HOST:CONTAINER. Việc này giúp ánh xạ cổng máy tính của bạn với cổng của container. • Environment Variables: Sử dụng environment cho các giá trị đơn giản hoặc env_file để lưu trữ các thông tin bảo mật trong một tệp .env riêng biệt. • Volumes: Sử dụng volumes để giữ dữ liệu của bạn an toàn. Nếu không có volumes, dữ liệu cơ sở dữ liệu sẽ biến mất khi container dừng lại. • Networks: Compose tự động tạo một mạng. Các container giao tiếp với nhau bằng tên service thay vì sử dụng localhost. • Depends_on: Thiết lập thứ tự khởi động. Nó yêu cầu Docker khởi động cơ sở dữ liệu trước backend. Lưu ý rằng nó không đợi cho đến khi cơ sở dữ liệu sẵn sàng hoàn toàn.

Mẹo phỏng vấn

  • Khi nào dùng build thay vì image? Dùng build cho ứng dụng tùy chỉnh của bạn. Dùng image cho các công cụ có sẵn từ Docker Hub.
  • Các container giao tiếp với nhau như thế nào? Chúng sử dụng tên service làm hostname trong mạng Docker.
  • Làm thế nào để tránh mất dữ liệu? Luôn sử dụng named volumes cho các cơ sở dữ liệu.
  • Cách xử lý các thông tin bảo mật? Đừng bao giờ viết trực tiếp (hardcode) chúng. Hãy sử dụng tệp .env.

Các lỗi thường gặp cần tránh

  • Sử dụng tag latest: Điều này gây ra các bản cập nhật không mong muốn. Hãy sử dụng các phiên bản cụ thể như postgres:16.
  • Sử dụng localhost: Các container không thể nhìn thấy nhau thông qua localhost. Hãy sử dụng tên service.
  • Không có healthchecks: Hãy sử dụng healthchecks để giám sát xem dịch vụ của bạn đã thực sự sẵn sàng hoạt động hay chưa.

Source: https://dev.to/adityaguptareal/docker-compose-complete-guide-1gac