Skip to content

Module 6: Under the Hood (Bên dưới nắp Capo)

🎓 Instructor Profile

Giáo sư Tom (Chuyên gia HDH) & Kỹ sư Raizo. Đây là module Khó nhấtHấp dẫn nhất. Chúng ta sẽ ngừng gõ lệnh Docker và đi sâu vào lõi Linux Kernel để xem bộ máy này thực sự hoạt động như thế nào.

Bạn nghĩ Docker là một công nghệ mới diệu kỳ? Không. Docker thực chất là một "nghệ thuật sắp đặt" (Orchestration Art) của các tính năng đã tồn tại trong Linux từ cả chục năm trước.

Hãy cùng mở nắp capo lên và nhìn vào động cơ V8 bên dưới.


🎭 Phần 1: The Great Illusion (Ảo ảnh vĩ đại)

Sự thật gây sốc

Trong Linux Kernel, KHÔNG CÓ cái gì gọi là "Container". Kernel chỉ biết đến Process (Tiến trình).

Container, về bản chất, chỉ là một Process bình thường (như Firefox, Chrome), nhưng bị Kernel "bịt mắt" (để không nhìn thấy process khác) và "trói tay" (để không dùng quá tài nguyên).

"Docker is just a fancy user interface for Linux Kernel features."


🧱 Phần 2: Namespaces (Những bức tường ngăn cách)

Làm sao để Process A không nhìn thấy Process B, dù chúng chạy trên cùng một máy? Câu trả lời là Namespaces (Không gian tên). Nó tạo ra sự cô lập (Isolation).

6 Loại Namespaces cốt lõi

NamespaceChức năng (Isolation)Ví dụ minh họa
PIDCô lập ID tiến trình.Trong container, process thấy mình là PID 1 (Vua). Nhưng ngoài Host, nó là PID 12345 (Dân thường).
NETCô lập Mạng.Container có eth0 riêng, IP riêng, bảng định tuyến riêng.
MNTCô lập File System.Container nhìn thấy thư mục gốc / là một thế giới hoàn toàn khác với / của Host.
UTSCô lập Hostname.Container có tên máy riêng (VD: a1b2c3d4e5f6) khác với tên máy thật.
IPCCô lập Giao tiếp.Ngăn container dùng Shared Memory để đọc trộm dữ liệu process khác.
USERCô lập User ID.Root trong container (UID 0) có thể bị map thành User thường (UID 1000) ngoài Host.

👮 Phần 3: Cgroups (Cảnh sát tài nguyên)

Namespaces chỉ giúp "che mắt" (Isolation), nhưng không ngăn được việc dùng chùa tài nguyên. Một process bị cô lập vẫn có thể ăn hết 100% RAM của máy.

Control Groups (Cgroups) sinh ra để giải quyết vấn đề Limitation (Giới hạn).

Chức năng của Cgroups

  1. Resource Limiting: Giới hạn RAM (VD: 512MB), CPU (0.5 core).
  2. Prioritization: Ưu tiên process quan trọng (VIP) được dùng nhiều CPU hơn.
  3. Accounting: Đo lường xem container đã dùng bao nhiêu tài nguyên (để tính tiền Cloud).
  4. Control: Đóng băng (Freeze) hoặc Kill cả nhóm process.

👉 Ví dụ: Cgroups giống như cái cầu chì (Circuit Breaker). Nếu container dùng quá dòng điện (RAM) cho phép -> Cắt (OOM Kill).


🪄 Phần 4: The Storage Magic (Phép thuật lưu trữ)

Tư duy @[/performance]: Tại sao bạn khởi động 100 container Ubuntu (mỗi cái 70MB) mà ổ cứng không bị tốn 100 x 70MB = 7GB? Thực tế chỉ tốn... vài KB.

Union File System (UnionFS) & Overlay2

Docker sử dụng cơ chế Layered Architecture (Kiến trúc phân lớp). Image gồm nhiều lớp Read-only xếp chồng lên nhau.

Copy-on-Write (CoW)

  • Khi đọc: Container đọc xuyên qua các lớp trong suốt.
  • Khi ghi: Container KHÔNG sửa trực tiếp vào Image (vì Read-only).
    1. Nó tìm file cần sửa ở lớp dưới.
    2. Copy file đó lên lớp trên cùng (Write Layer).
    3. Nó sửa (Write) vào bản copy đó.

👉 Kết quả: Nếu bạn không sửa file, bạn không tốn dung lượng đĩa mới. Rất thông minh!


⚙️ Phần 5: The Runtime Hierarchy (Hệ thống phân cấp)

Khi bạn gõ docker run, điều gì thực sự xảy ra? (Kiến trúc hiện đại).

  1. Docker CLI: Gửi lệnh REST API đến Daemon.
  2. Dockerd (Daemon): Tiếp nhận yêu cầu.
  3. Containerd: (High-level Runtime). Quản lý vòng đời container, kéo image từ Registry. Đây là "trái tim" mà Kubernetes cũng sử dụng (K8s đã bỏ Docker để dùng thẳng Containerd).
  4. Runc: (Low-level Runtime / OCI Runtime). Đây là "công nhân" thực sự. Nó gọi trực tiếp vào Kernel (Syscalls) để tạo Namespaces và Cgroups. Sau khi tạo xong container, Runc tự thoát (exit).

Tư duy @[/architect]: Sự tách biệt này cho phép dockerd có thể restart/update mà không làm chết các container đang chạy (Live Restore).


🥊 The Final Challenge: "No Docker" Challenge

Bài tập tốt nghiệp dành cho True Engineer. Hãy tạo ra một container thô sơ trên Linux mà KHÔNG ĐƯỢC DÙNG lệnh docker.

Gợi ý:

  1. Tải một file hệ thống root (RootFS) của Alpine Linux.
  2. Dùng lệnh unshare để tạo Namespace mới (PID, MNT, UTS).
    bash
    sudo unshare --fork --pid --mount-proc /bin/bash
  3. Dùng lệnh chroot để đổi thư mục gốc vào RootFS đã tải.
  4. ps aux xem PID có phải là 1 không? Gõ hostname xem đổi chưa?

Nếu bạn làm được, bạn đã hiểu bản chất của Containerization. Chúc mừng bạn đã tốt nghiệp Docker Masterclass! 🎉