Tương tác: so sánh kiến trúc container vs VM, demo namespace (PID, network, mount, UTS),
điều chỉnh slider cgroup CPU/memory và xem trạng thái throttle/OOM,
mô phỏng OverlayFS với Copy-on-Write.
1. Container vs VM — Kiến trúc so sánh
Click vào từng lớp để xem giải thích. So sánh điểm khác nhau giữa hai kiến trúc.
Container (Docker/OCI)
App A (Nginx)
Libs / Runtime (glibc, node...)
App B (Python service)
Libs / Runtime
Namespace (PID, net, mnt...)
cgroup (CPU, memory limit)
Linux Kernel host (dùng chung)
Phần cứng vật lý
Máy ảo (VM)
App A (Nginx)
Guest OS + Kernel A (Linux)
App B (Windows IIS)
Guest OS + Kernel B (Windows)
Hypervisor (KVM / ESXi)
Host OS / Bare-metal
Phần cứng vật lý
Click vào một lớp để xem giải thích chi tiết.
Tiêu chí
Container
Máy ảo
Kernel
Dùng chung host kernel
Kernel riêng mỗi VM
Khởi động
~50–200ms
30–120 giây
RAM footprint
5–50 MB / container
512 MB – 2 GB / VM
Cô lập
Trung bình (share kernel)
Mạnh (hypervisor)
Chạy OS khác
Không (chỉ Linux nếu host Linux)
Có (bất kỳ OS)
Overhead
~1–5%
~5–20%
Dùng cho
Microservice, CI/CD, scale
Cô lập mạnh, OS khác, legacy
2. Namespace — Cô lập View
Host — PID thật
Container — PID ảo (namespace)
Host Network namespace
eth0: 192.168.1.100/24
lo: 127.0.0.1
docker0: 172.17.0.1/16
veth0abc: (paired với container)
route: default via 192.168.1.1
Container Network namespace
eth0: 172.17.0.2/16
lo: 127.0.0.1 (không thấy eth0 host) (không thấy docker0)
route: default via 172.17.0.1
Cơ chế veth pair: Docker tạo một cặp interface ảo: veth0abc ở host side (gắn vào bridge docker0) và eth0 trong container namespace. Packet từ container → eth0 → veth0abc → docker0 bridge → NAT → eth0 host → Internet. Port mapping-p 8080:80: iptables DNAT trên host: gói đến host:8080 → redirect đến 172.17.0.2:80.
pivot_root: Khi tạo container, Docker dùng pivot_root() để đổi root filesystem của tiến trình sang OverlayFS merged directory. Container thấy image filesystem như root (/) của mình — không thấy /home, /var/lib/docker của host. Bind mount (-v /host/data:/data): trong mount namespace container, gắn thư mục host vào đường dẫn container — cách duy nhất để dữ liệu tồn tại sau khi container bị xóa.
Host UTS namespace
hostname: prod-server-01
domainname: example.com
Container UTS namespace
hostname: a1b2c3d4e5f6
(container ID prefix)
hoặc tùy chỉnh: --hostname web-01
UTS namespace cô lập hostname và domainname. Trong container, lệnh hostname trả về container ID (hoặc hostname custom). Lệnh sethostname() trong container chỉ ảnh hưởng UTS namespace của container, không ảnh hưởng host. Quan trọng khi app config dựa vào hostname.
Container UID 0 (root)
→ Host UID 100000
Container UID 1
→ Host UID 100001 root trong container KHÔNG phải root thật!
User namespace: ánh xạ UID/GID giữa container và host. Rootless container: tiến trình UID 0 (root) trong container thực ra là UID 100000 (unprivileged user) ở host. Nếu container breakout, attacker chỉ có quyền của user 100000 — không phải root thật. Bảo mật tốt hơn nhiều so với container thông thường (chạy root thật).
3. cgroup — Giới hạn Tài nguyên
Kéo slider để thay đổi tải CPU và memory của container. Quan sát khi đạt giới hạn cgroup.
2.0 core
0.8 core
512 MB
200 MB
CPU Usage
0%
OK
Memory Usage
0%
OK
Điều chỉnh slider để xem cgroup hoạt động.
4. OverlayFS — Copy-on-Write
Chọn hành động để mô phỏng OverlayFS. 2 container (C1, C2) cùng dùng chung image layers.