Giao diện
Module 1: Genesis & Architecture (Khởi nguyên & Kiến trúc)
🎓 Instructor Profile
Bài giảng được biên soạn bởi sự hợp tác giữa Giáo sư Tom (MIT) - chuyên gia về lý thuyết hệ thống, và Kỹ sư Raizo (Phó CTO HPN) - người có 10 năm kinh nghiệm vận hành Kubernetes quy mô lớn.
Chào mừng các kỹ sư đến với Docker Masterclass. Chúng ta không ở đây để học gõ lệnh vẹt. Chúng ta ở đây để thấu hiểu Deep Tech - trái tim của kỷ nguyên Cloud Native.
Trong module mở màn này, chúng ta sẽ mổ xẻ kiến trúc của Docker, giải mã tại sao nó lại chiến thắng trong cuộc chiến ảo hóa và nắm vững "Bộ ba quyền lực" kiến tạo nên thế giới Container.
🏗️ Phần 1: The Virtualization War (Cuộc chiến ảo hóa)
Để hiểu Docker, trước tiên ta phải hiểu "kẻ thù" mà nó đã đánh bại (hoặc chính xác hơn là bổ sung): Virtual Machines (VM).
1.1 The Metaphor: Biệt thự vs Chung cư
Hãy tưởng tượng bạn cần chỗ ở cho một ứng dụng.
Virtual Machine (VM) là một căn Biệt thự đơn lập:
- Để xây nó, bạn phải làm móng, dựng cột, xây tường, lắp điện nước riêng biệt (Guest OS).
- Mỗi biệt thự tốn rất nhiều đất (Tài nguyên phần cứng: RAM, CPU).
- Muốn vào ở (Khởi động), bạn mất cả tháng xây dựng (Phút để boot).
- Ưu điểm: Cách âm tuyệt đối. Hàng xóm cháy nhà, bạn vẫn an toàn (Isolation cực cao).
Container là một căn hộ trong Chung cư cao cấp:
- Tòa chung cư đã có sẵn móng, cột, điện nước tổng (Host Kernel).
- Bạn chỉ cần xách vali vào ở (Application + Libs). Không cần xây lại móng.
- Tốn ít diện tích, chia sẻ tiện ích chung cực kỳ hiệu quả.
- Vào ở ngay lập tức (Khởi động tính bằng mili-giây).
1.2 Deep Dive: Tại sao Container nhanh thần tốc?
Bí mật nằm ở Kernel Sharing.
- VM: Mỗi VM phải tải một nhân hệ điều hành (kernel) riêng. Việc boot một OS tốn hàng trăm MB RAM và hàng triệu chu kỳ CPU chỉ để... khởi động.
- Container: Không boot OS mới. Nó tận dụng ngay Kernel của máy chủ đang chạy. Nó chỉ đơn giản là một Process (tiến trình) được "cách ly" bởi các công nghệ Linux Namespace bọc ngoài (cgroups, namespaces).
- Boot VM = Khởi động máy tính.
- Boot Container = Bật một phần mềm (như bật Chrome).
💡 Core Concept
Container KHÔNG phải là một cái máy tính thu nhỏ. Container LÀ một tiến trình (Process) bị nói dối rằng nó đang ở một mình.
🧠 Phần 2: The Docker Engine Architecture (Kiến trúc động cơ)
Docker hoạt động theo mô hình Client-Server. Khi bạn gõ lệnh trên màn hình đen, thực ra bạn chỉ đang cầm cái điều khiển từ xa (Remote).
2.1 Các thành phần chính
- Docker Client (CLI): Giao diện dòng lệnh (
docker build,docker run). Nơi bạn ra lệnh. - Docker Daemon (
dockerd): "Bộ não" thực sự. Nó chạy ngầm (background service) trên máy chủ, lắng nghe API requests từ Client và thực thi các công việc nặng nhọc (quản lý Container, Image, Network, Volume). - Docker Registry: Nhà kho khổng lồ chứa các kiện hàng (Image). Nổi tiếng nhất là Docker Hub.
2.2 Data Flow: Chuyện gì xảy ra khi gõ docker run nginx?
- Client gửi lệnh đến Daemon.
- Daemon kiểm tra xem đã có bản thiết kế (Image) của
nginxchưa. - Nếu chưa, nó lên Registry tải về.
- Sau đó, nó dựng Container và báo cáo kết quả.
⚡ Phần 3: The Big 3 Concepts (Bộ ba quyền lực)
Để làm chủ Docker, hãy tư duy theo Lập trình hướng đối tượng (OOP).
| Docker Concept | OOP Analogy | Tính chất |
|---|---|---|
| Dockerfile | The Source Code | Bản thiết kế chi tiết, các bước để tạo ra một Image. |
| Image | The Class | Khuôn mẫu. Chứa mọi thứ (Code, Libs, OS file system). Bất biến (Immutable). |
| Container | The Object (Instance) | Thực thể sống. Được sinh ra từ Image. Có thể đọc/ghi dữ liệu. |
Tính Bất biến (Immutability) của Image
Đây là "kinh thánh" của Docker. Một khi Image đã được build (đóng gói), nó KHÔNG BAO GIỜ thay đổi.
- Bạn muốn sửa code? -> Sửa Dockerfile, build ra Image mới (V2).
- Tuyệt đối không chui vào Container sửa code rồi lưu lại. Đó là tư duy sai lầm ("Pet vs Cattle").
-> Write Once, Run Anywhere. Vì Image không đổi, nên nó chạy trên máy dev thế nào, lên Server chạy y hệt thế nấy. Tạm biệt câu nói huyền thoại: "Ở máy em nó chạy bình thường mà!"
🔄 Phần 4: The Lifecycle (Vòng đời thực chiến)
Hãy hình dung quy trình nấu ăn để nhớ các lệnh CLI:
Đi chợ (
docker pull): Ra siêu thị (Registry) mua nguyên liệu đóng gói sẵn (Image) về.bashdocker pull ubuntu:22.04Nấu ăn (
docker run): Bật bếp chế biến nguyên liệu thành món ăn (Container).bash# -it: Interactive (chui vào trong container để tương tác) docker run -it ubuntu:22.04 /bin/bashKiểm tra bếp (
docker ps): Xem đang nấu món gì, món nào đang sôi (Running), món nào đã tắt bếp (Exited).bashdocker ps -a # -a: Liệt kê cả container đã tắtDọn dẹp (
docker stop&docker rm): Ăn xong phải rửa bát.- Tắt bếp:bash
docker stop [CONTAINER_ID]⚠️ STOP vs KILL
docker stop: Gửi tín hiệu SIGTERM. Cho ứng dụng thời gian dọn dẹp, lưu file, đóng kết nối DB nhẹ nhàng (Graceful Shutdown).docker kill: Gửi tín hiệu SIGKILL. Rút phích cắm điện ngay lập tức. Dễ gây lỗi dữ liệu. Hạn chế dùng.
- Vứt rác:bash
docker rm [CONTAINER_ID]
- Tắt bếp:
🎯 Mini-Challenge: Hello Docker World
Đã đến lúc thực hành. Hãy chứng minh hệ thống của bạn đã sẵn sàng.
Nhiệm vụ:
- Chạy container kinh điển
hello-world. - Kiểm tra danh sách container để thấy nó đã chạy xong và tắt (Exited).
- Xóa sạch dấu vết của container đó (Không để rác trên máy).
👉 Xem đáp án (Chỉ mở khi đã thử làm!)
bash
# 1. Chạy container
docker run hello-world
# 2. Kiểm tra (sẽ thấy status Exited)
docker ps -a
# 3. Xóa container (Thay ID bằng ID thực tế của bạn)
docker rm [CONTAINER_ID]
# Pro-tip: Chạy xong tự hủy ngay lập tức
docker run --rm hello-world💡 Next Steps
Bạn đã hiểu Kiến trúc và Vòng đời. Ở module tiếp theo, chúng ta sẽ học cách tự viết "Bản thiết kế" cho riêng mình với Dockerfile Deep Dive. Đừng bỏ lỡ!