Bỏ qua để đến nội dung

Docker

Thời gian: 3 buổi × 90 phút = 4.5 giờ
Output: Dockerfile + docker-compose cho stack Next.js + NestJS + PostgreSQL + Redis

“Chạy được trên máy tôi” không có nghĩa chạy được production. Làm sao đảm bảo dev, staging, production giống nhau? Làm sao build image nhỏ, an toàn, khởi động nhanh?

Lựa chọn Khi nào dùng Khi nào KHÔNG dùng
Docker Mọi project có > 1 service (FE + BE + DB) Chỉ 1 static site deploy Vercel
docker-compose Local dev, staging, solo deploy < 5 services Production multi-node (dùng Swarm/K8s — Nhánh A)
Multi-stage build Giảm image size, tách build deps vs runtime deps Image đã nhỏ sẵn (Alpine + copy binary)
Docker Desktop Local dev macOS/Windows Linux server (dùng Docker Engine)

Docker + docker-compose cho mọi project trong lộ trình. Multi-stage build bắt buộc. Không dùng latest tag.

  • FROM node:latest → không reproducible, có thể break bất cứ lúc nào.
  • Copy toàn bộ source rồi npm install → image to, layer cache không hiệu quả.
  • Chạy container với root user → security risk.
  • Không có HEALTHCHECK → orchestrator không biết container đã sẵn sàng chưa.

Bối cảnh: docker-compose up → NestJS container crash vì PostgreSQL chưa sẵn sàng. Dev thêm restart: always nhưng app vẫn lỗi 10 lần trước khi DB xong.

Quyết định: Dùng depends_on kết hợp condition: service_healthy + HEALTHCHECK trong Dockerfile Postgres. Hoặc dùng entrypoint script đợi DB sẵn sàng (wait-for-it.sh).

Bài học: depends_on chỉ đợi container start, không đợi service sẵn sàng. Luôn có cơ chế retry hoặc healthcheck đúng.