Learning Outcome & Exercises: Docker
Tổng kết chương Docker: học xong mình phải làm được gì, và làm bài tập nào để chứng minh?
Đọc hiểu chưa đủ để đi phỏng vấn. Mỗi chương kết thúc bằng những việc làm được và chứng minh được: có code chạy, có test cho cả trường hợp lỗi, có log hoặc số đo. Bài tập nằm trong repo riêng java-backend-interview-labs, thư mục labs/docker.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Viết Dockerfile multi-stage, chạy non-root, image nhỏ.
- Chứng minh exec-form ENTRYPOINT nhận SIGTERM và Spring Boot shutdown gọn gàng.
- Dựng Compose gồm app + PostgreSQL có healthcheck.
2. Basic: Multi-stage Dockerfile
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Build image Spring Boot multi-stage; so kích thước với single-stage; chạy user không phải root.
Bài liên quan: Image, layer, container, Dockerfile
Hoàn thành khi:
- docker images trước/sau
- docker inspect User
3. Intermediate: PID 1 & SIGTERM
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
So sánh ENTRYPOINT shell form và exec form: docker stop → log graceful shutdown hay bị kill sau 10s.
Bài liên quan: PID 1 & signal, Namespace & cgroups
Hoàn thành khi:
- Log 2 trường hợp có timestamp
4. Challenge: Compose & security
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Compose app + PostgreSQL + healthcheck + volume; secret qua env file không commit; quét image.
Bài liên quan: Volume & networking, Compose, Security
Hoàn thành khi:
- docker compose up chạy được
- Kết quả scan có ghi chú
5. Tiêu chí hoàn thành chung
- Tự giải thích được bài toán và vì sao chọn giải pháp.
- Code chạy được bằng lệnh ghi trong README, không chứa secret.
- Có test tự động cho happy path và failure path.
- Có log hoặc số đo trong
evidence/chứng minh kết quả. - Có câu trả lời phỏng vấn ngắn bằng tiếng Việt và tiếng Anh.
- README của lab có link ngược về bài học tương ứng.
6. Lab và trạng thái
| Mức | Bài tập | Trạng thái | Test / bằng chứng |
|---|---|---|---|
| Basic | Multi-stage Dockerfile | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Intermediate | PID 1 & SIGTERM | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Challenge | Compose & security | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
Repo lab: java-backend-interview-labs/labs/docker. TODO: link GitHub là placeholder cho tới khi repo được push.
evidence/; chỉ đánh dấu xong khi có bằng chứng.Phỏng vấn hỏi về Docker, câu nào hay gặp nhất và trả lời sao?
Q1. Vì sao container Java nhận docker stop mà vẫn bị kill sau 10 giây?
🇻🇳 Tiếng Việt:
Thường do ENTRYPOINT dạng shell: PID 1 là sh, nó không chuyển SIGTERM cho java. Dùng exec form hoặc exec trong script để java là PID 1 và nhận tín hiệu.
🇬🇧 English:
Usually the ENTRYPOINT uses shell form: PID 1 is sh and it does not forward SIGTERM to java. Use the exec form, or exec in the script, so that java is PID 1 and receives the signal.
Cách nhớ ngắn gọn
- Mỗi bài tập = code + test + log.
- Luôn có ít nhất một failure case.
- Chưa có bằng chứng thì chưa xong.
Tự kiểm tra
Bài tập Basic (Multi-stage Dockerfile) được coi là xong khi nào?
docker images trước/sau; docker inspect User. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (PID 1 & SIGTERM) được coi là xong khi nào?
Log 2 trường hợp có timestamp. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (Compose & security) được coi là xong khi nào?
docker compose up chạy được; Kết quả scan có ghi chú. Chưa có code chạy và bằng chứng thì chưa tính là xong.