“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ần | Vai trò | Lưu ý |
|---|---|---|
| Image | Mẫu chỉ đọc dùng để tạo container | Nên ghim phiên bản phù hợp thay vì phụ thuộc mơ hồ vào latest |
| Container | Tiến trình đang chạy từ image | Có 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 |
| Volume | Lưu dữ liệu bền vững như database | Chỉ xóa khi chắc chắn không cần dữ liệu local |
| Network | Cho 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
Dockerfileriê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
- 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.
- Các phiên bản image được ghi rõ và có kế hoạch cập nhật.
- Không có mật khẩu thật, token hay dữ liệu khách hàng trong repository.
- Database và dịch vụ phụ thuộc có healthcheck hợp lý.
- Lệnh migrate, seed, test và xem log đều được tài liệu hóa.
- 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.




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