Docker
This content is not available in your language yet.
Docker
Phần tiêu đề “Docker”Thời gian: 3 buổi × 90 phút = 4.5 giờ
Output: Dockerfile + docker-compose cho stack Next.js + NestJS + PostgreSQL + Redis
Vấn đề
Phần tiêu đề “Vấn đề”“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?
Bảng quyết định
Phần tiêu đề “Bảng quyết định”| 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) |
Quyết định mặc định
Phần tiêu đề “Quyết định mặc định”Docker + docker-compose cho mọi project trong lộ trình. Multi-stage build bắt buộc. Không dùng latest tag.
Anti-pattern
Phần tiêu đề “Anti-pattern”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
rootuser → security risk. - Không có
HEALTHCHECK→ orchestrator không biết container đã sẵn sàng chưa.
Checklist chi tiết
Phần tiêu đề “Checklist chi tiết”Dockerfile
Phần tiêu đề “Dockerfile”docker-compose
Phần tiêu đề “docker-compose”Health Checks & Security
Phần tiêu đề “Health Checks & Security”War Story: Container khởi động trước DB
Phần tiêu đề “War Story: Container khởi động trước DB”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.