DevOps 22/09/2026 6 phút

Dockerfile cache: vì sao đổi một dòng code khiến build cài lại toàn bộ dependencies

Mỗi lệnh Dockerfile là một layer được cache; đổi một layer làm hỏng cache của MỌI layer sau nó. Đặt COPY . . trước khi cài dependencies là lỗi kinh điển: sửa một dòng code buộc build cài lại toàn bộ deps. Bài này đo thật hai Dockerfile cùng app: sau khi sửa code, bản sai mất 3.8s (cài lại deps), bản đúng chỉ 0.6s.

DevOps 22/09/2026 5 phút

Build context: vì sao docker build gửi cả thư mục lên daemon, và .dockerignore cứu bạn

Dấu chấm trong docker build . là build context — docker nén CẢ thư mục và gửi lên daemon trước khi build, kể cả file không dùng tới. Bài này đo thật: một thư mục 70MB (node_modules + .git) gửi nguyên context 70.01MB dù Dockerfile chỉ COPY app.py; thêm .dockerignore, context còn 4.096kB — và quan trọng hơn, nó chặn .env/.git lọt vào image.

DevOps 22/09/2026 5 phút

Multi-stage build: vì sao image Go của bạn nặng 400MB thay vì 3MB

Để BUILD một chương trình cần trình biên dịch và cả toolchain hàng trăm MB; để CHẠY chỉ cần binary vài MB. Nếu build và chạy cùng một image, image cuối mang theo cả toolchain. Bài này build một chương trình Go thật hai cách: một-stage cho image 407MB, multi-stage (copy binary sang scratch) cho 3.4MB — cùng chạy y hệt, giảm ~120 lần.

DevOps 22/09/2026 5 phút

Container networking: gọi nhau bằng tên, và vì sao mạng bridge mặc định không có DNS

Trong một mạng bridge tuỳ chỉnh, container gọi nhau bằng tên (Docker có DNS nội bộ); nhưng mạng bridge MẶC ĐỊNH thì không — gọi bằng tên báo bad address. Bài này chạy thật: container gọi nhau qua tên trên mạng riêng, lỗi trên mạng mặc định, và -p publish cổng để host vào được container (curl trả 200).

DevOps 22/09/2026 6 phút

Volume vs bind mount: vì sao dữ liệu ghi trong container biến mất khi xoá

Dữ liệu ghi vào lớp container là tạm — xoá container là mất sạch, kể cả database. Bài này chạy thật: ghi /data.txt rồi xoá container thì file biến mất; named volume giữ dữ liệu qua vòng đời container; và bind mount cho host với container thấy cùng file hai chiều. Cùng cách chọn volume hay bind mount cho từng việc.

DevOps 22/09/2026 6 phút

Bảo mật container: vì sao container mặc định chạy root, và ba lớp phòng thủ giảm rủi ro

Mặc định container chạy dưới quyền root — kẻ khai thác được app là có root trong container. Bài này đo thật ba lớp phòng thủ: --user chạy non-root (ghi /etc bị Permission denied), --cap-drop ALL bỏ quyền đặc quyền (root cũng không chown được), và --read-only khoá rootfs (không ghi được binary). Phòng thủ theo lớp để một container bị chiếm không thành thảm hoạ.