Lập trình · 18/09/2026

Docker Compose: Xây dựng môi trường lập trình đồng nhất cho cả nhóm

“Máy em chạy được” thường là dấu hiệu môi trường phát triển chưa được mô tả đủ rõ. Khi mỗi thành viên tự cài PHP, cơ sở dữ liệu, bộ nhớ đệm và công cụ phụ trợ theo một cách khác nhau, lỗi phiên bản và cấu hình sẽ xuất hiện sớm hay muộn. Docker Compose giúp biến các phụ thuộc đó thành một cấu hình có thể lưu cùng mã nguồn và khởi động lại nhất quán.

Docker Compose: Xây dựng môi trường lập trình đồng nhất cho cả nhóm

“Máy em chạy được” thường là dấu hiệu môi trường phát triển chưa được mô tả đủ rõ. Khi mỗi thành viên tự cài PHP, cơ sở dữ liệu, bộ nhớ đệm và công cụ phụ trợ theo một cách khác nhau, lỗi phiên bản và cấu hình sẽ xuất hiện sớm hay muộn. Docker Compose giúp biến các phụ thuộc đó thành một cấu hình có thể lưu cùng mã nguồn và khởi động lại nhất quán.

Docker Compose giải quyết vấn đề gì?

Một ứng dụng web hiếm khi chỉ có mã nguồn. Nó có thể cần máy chủ ứng dụng, MySQL hoặc PostgreSQL, Redis, dịch vụ email giả lập và tiến trình chạy hàng đợi. Compose mô tả các thành phần này dưới dạng service, cùng mạng, ổ đĩa và biến môi trường cần thiết.

Thay vì viết tài liệu cài đặt dài và hy vọng mọi người làm giống nhau, nhóm có thể dùng một lệnh để tạo cùng một hệ thống dịch vụ. Cách làm này đặc biệt hữu ích khi tiếp nhận thành viên mới, chuyển máy hoặc tái hiện lỗi.

Một cấu hình tối thiểu dễ hiểu

services:
  app:
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./:/var/www/html
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mysql:8.4
    environment:
      MYSQL_DATABASE: app
      MYSQL_USER: app
      MYSQL_PASSWORD: local_password
      MYSQL_ROOT_PASSWORD: local_root_password
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 10

  redis:
    image: redis:7-alpine

volumes:
  db_data:

depends_on thể hiện thứ tự phụ thuộc, còn healthcheck giúp Compose biết cơ sở dữ liệu đã sẵn sàng nhận kết nối hay chưa. Điều này đáng tin cậy hơn việc chỉ chờ container được khởi động.

Phân biệt các thành phần chính

Thành phầnVai tròLưu ý
ImageMẫu chỉ đọc dùng để tạo containerNên ghim phiên bản phù hợp thay vì phụ thuộc mơ hồ vào latest
ContainerTiến trình đang chạy từ imageCó thể xóa và tạo lại; không dùng filesystem bên trong để lưu dữ liệu lâu dài
VolumeLưu dữ liệu bền vững như databaseChỉ xóa khi chắc chắn không cần dữ liệu local
NetworkCho các service liên lạc bằng tênỨng dụng kết nối tới host db hoặc redis, không dùng localhost

Quản lý biến môi trường và bí mật

Compose hỗ trợ khai báo biến trực tiếp, nội suy từ shell hoặc đọc tệp môi trường. Tuy nhiên, tệp chứa mật khẩu thật không nên được commit. Hãy cung cấp .env.example chỉ gồm tên biến và giá trị mẫu an toàn; dữ liệu nhạy cảm cho staging hoặc production nên đi qua cơ chế secrets của nền tảng triển khai.

Container hóa môi trường local không đồng nghĩa cấu hình local có thể được bê nguyên lên production. Production vẫn cần chiến lược riêng cho secrets, backup, giám sát, cập nhật và khả năng phục hồi.

Quy trình làm việc hằng ngày

docker compose up -d --build
docker compose ps
docker compose logs -f app
docker compose exec app php artisan migrate
docker compose down

Chỉ thêm -v vào docker compose down khi chủ đích muốn xóa cả volume. Với database local có dữ liệu kiểm thử quan trọng, thao tác này có thể làm mất công sức chuẩn bị dữ liệu.

Tối ưu trải nghiệm lập trình

  • Tạo Dockerfile riêng cho development nếu cần debugger hoặc công cụ chất lượng mã.
  • Dùng bind mount cho mã nguồn nhưng tránh mount đè thư mục dependency nếu hệ điều hành host gây chậm I/O.
  • Thêm healthcheck cho database và message broker mà ứng dụng phải chờ.
  • Ghim phiên bản image có chủ đích và lên lịch cập nhật.
  • Đặt các lệnh thường dùng trong script hoặc Makefile để người mới không phải nhớ chi tiết dài.

Các lỗi thường gặp

Ứng dụng không kết nối được database

Bên trong network của Compose, DB_HOST phải là tên service như db, không phải 127.0.0.1. Đồng thời kiểm tra cổng nội bộ, healthcheck và log của cả hai service.

Sửa mã nhưng container không cập nhật

Kiểm tra đường dẫn volume, working directory và cache của framework. Thay đổi dependency hoặc extension hệ thống cần build lại image; thay đổi mã nguồn thông thường chỉ cần bind mount đúng.

Dữ liệu biến mất sau khi khởi động lại

Database cần dùng named volume và mount đúng thư mục dữ liệu của image. Việc xóa volume hoặc đổi tên project Compose có thể khiến hệ thống tạo một vùng dữ liệu mới.

Checklist trước khi đưa vào nhóm

  1. Thành viên mới có thể khởi động dự án từ README mà không cần hướng dẫn miệng.
  2. Các phiên bản image được ghi rõ và có kế hoạch cập nhật.
  3. Không có mật khẩu thật, token hay dữ liệu khách hàng trong repository.
  4. Database và dịch vụ phụ thuộc có healthcheck hợp lý.
  5. Lệnh migrate, seed, test và xem log đều được tài liệu hóa.
  6. Nhóm đã thử xóa container và dựng lại để xác nhận dữ liệu cần thiết vẫn được giữ.

Kết luận

Docker Compose không loại bỏ mọi khác biệt giữa local và production, nhưng nó tạo ra một hợp đồng môi trường rõ ràng cho đội phát triển. Hãy bắt đầu từ vài service thật sự cần thiết, chuẩn hóa lệnh hằng ngày và kiểm tra khả năng dựng lại từ đầu.

Nguồn tham khảo

Thảo luận

Bình luận 0

Đăng nhập để bình luận

Bạn cần có tài khoản để tham gia thảo luận và trả lời độc giả khác.

Đăng nhậpĐăng ký

Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.