Part 11 · Docker · 11.4
Sai lầm và checklist Docker
Image chạy được chưa đủ: phải repeatable, least-privilege, observable và shutdown/recover đúng. Trang này dùng để tự kiểm tra các lỗi tư duy và tiêu chí hoàn thành trước khi coi phần Docker là đã nắm chắc.
Red flags
1. Gọi container là “VM nhẹ”. Container dùng isolation của kernel nhưng vẫn chia sẻ host kernel; nếu không hiểu boundary này, rất dễ đánh giá sai security, resource isolation và failure blast radius.
2. Mutable
latest, COPY toàn repo sớm, secret trong ARG/ENV/layer. Kết quả build khó reproducible, cache bị phá rộng, và secret có thể tồn tại trong image history/layer dù file cuối đã bị xóa.3. Root/privileged, mount Docker socket,
chmod 777. Đây là dấu hiệu đang bỏ qua least privilege; compromise trong container có thể mở rộng thành compromise host hoặc control plane Docker.4. State hoặc log quan trọng nằm trong writable layer. Container recreate có thể làm mất dữ liệu; disk pressure cũng khó kiểm soát. Data lifecycle phải được gắn rõ với volume/bind/tmpfs và log pipeline.
5. Shell làm PID 1, không SIGTERM/drain, rồi tăng stop timeout để che lỗi. Failure window lúc deploy/restart sẽ kéo dài, request có thể bị cắt ngang và child process có thể thành zombie nếu signal/reaping không được xử lý đúng.
6. Copy-paste Nginx config mà không hiểu
location, buffering và proxy headers. Hệ quả thường xuất hiện ở timeout, upload/download lớn, client IP, WebSocket/SSE hoặc cache behavior chứ không nhất thiết ở happy path.Checklist
- Engine → containerd → runc: Tôi vẽ được call flow và giải thích component nào quản lý API, lifecycle và OCI runtime execution.
- OCI image/layer/container lifecycle: Tôi phân biệt image immutable với writable container layer, hiểu copy-on-write và điều gì mất khi container bị recreate.
- BuildKit/cache/secrets: Tôi sắp Dockerfile để cache ổn định, giảm build context, dùng multi-stage khi phù hợp và giữ credential/secret ngoài image layer.
- Isolation: Tôi phân biệt namespaces, cgroups, Linux capabilities và seccomp; biết mỗi cơ chế giải quyết một lớp isolation/resource/security khác nhau.
- Storage: Tôi chọn volume, bind mount hoặc tmpfs theo data lifecycle, ownership, backup/restore, portability và security boundary.
- Networking: Tôi debug bridge, DNS, NAT/port publishing và listener bằng cách đi từ app bind address → container namespace → bridge/NAT → host/firewall.
- Compose: Tôi viết service có health/retry, dependency, data/config và failure behavior rõ; không coi
depends_onlà đảm bảo application-ready nếu chưa có health semantics phù hợp. - Image hardening & supply chain: Tôi chạy non-root, giảm package/tool dư thừa, pin dependency/base theo mức phù hợp, scan vulnerability và có cách verify artifact/source.
- PID 1, signals, OOM: Tôi xử lý SIGTERM/graceful shutdown, child reaping, memory limit/OOM và biết quan sát exit code, restart count, memory pressure, CPU throttling cùng stop duration.
- Nginx: Tôi cấu hình/debug static file hoặc reverse proxy, hiểu routing, proxy headers, timeout/buffering và có thể xác minh behavior bằng request thật thay vì chỉ đọc config.
Production drill: Khi có deploy/restart hoặc host pressure, tôi xác định được failure window: traffic bắt đầu fail lúc nào, bao lâu service drain/stop, container restart mất bao lâu, health check khi nào chuyển trạng thái, backlog/error rate có tăng không và cần rollback/recovery tại ngưỡng nào.
Security check: Không mount Docker socket nếu không thật sự cần; tránh privileged; chỉ cấp capability cần thiết; không đưa secret vào image/command history; xác minh file permission và network exposure theo threat model của service.
Definition of Done
- Trả lời được ít nhất 24/30 câu ở phần câu hỏi và giải thích được lý do, không chỉ nhớ keyword.
- Hoàn thành ít nhất 6/8 lab, có evidence đủ để chứng minh build/run/debug/failure behavior.
- Có tối thiểu một drill cho SIGTERM, một drill cho OOM/resource limit và một drill cho network failure; ghi lại tín hiệu quan sát, failure window và cách recovery.
- Image cuối chạy non-root, đã scan, build có thể tái lập ở mức đã định và deployment dùng immutable reference/digest pinning khi cần kiểm soát artifact chính xác.
- Trả lời được ít nhất 8/10 câu core bằng tiếng Anh, gồm container vs VM và các trade-off production chính.
- Hoàn thành 4/4 execution labs hoặc cung cấp evidence tương đương cho build, SIGTERM, limits và read-only/networking.
Tự đánh giá cuối: Tôi không chỉ làm container “chạy được”, mà còn có thể giải thích isolation, data lifecycle, signal/restart behavior, operational signals, security boundary và cách rollback/recover khi failure xảy ra.