Module 2 — Container Networking: tổng quan
Ghép plumbing Linux thành mạng container: netns, veth, bridge from scratch, SNAT/DNAT, debug bằng nsenter/tcpdump. Prerequisite: Module 1.
TL;DR: Docker network không phải abstraction ma thuật — nó là script ghép bốn mảnh Module 1 trong network namespace: mỗi container một stack mạng riêng, nối host bằng veth pair, gom vào bridge (docker0), ra Internet qua SNAT/MASQUERADE, và publish port bằng DNAT. Module 2 dựng lại đúng pipeline đó from scratch (không cần Docker daemon), rồi luyện debug bằng nsenter, route/iptables trong netns, và tcpdump. Học xong bạn đọc được vì sao docker run -p hoạt động — và sửa khi không.
Vì sao module này tồn tại
Module 1 dạy bốn khối Lego trên host: stack, device ảo, bridge, netfilter. Production container hỏng ở chỗ khác: hai container "cùng network" nhưng không ping được; docker run -p 8080:80 mở port host mà packet không vào app; container curl được 1.1.1.1 từ host nhưng chính nó timeout.
CLI Docker che plumbing. docker network create chỉ là: tạo bridge → tạo netns → tạo veth pair → gắn một đầu vào netns, một đầu vào bridge → gán IP/route → chèn rule NAT. Không tự tay ghép một lần, mỗi lần debug bạn chỉ còn inspect + restart.
Module này không dạy Kubernetes Service hay CNI plugin (Module 3). Nó dạy ghép đủ một Docker-style bridge network bằng tay, rồi trace gói ra/vào và debug khi đứt ở giữa đường. Mọi pod network sau này chỉ là biến thể của cùng mô hình.
Đây là lộ trình ghép — đúng thứ tự bạn dựng lab và đúng thứ tự gói tin "chạm" khi container nói chuyện với thế giới:
flowchart LR
N["1. Network namespace<br/>isolated stack"] --> V["2. veth pair<br/>cable 2 ends"]
V --> L["3. Lab bridge<br/>docker0 from scratch"]
L --> S["4. SNAT<br/>out to Internet"]
S --> D["5. DNAT<br/>publish port"]
D --> G["6. Debug<br/>nsenter / tcpdump"]Sau module này bạn sẽ
- Implement network namespace và nối chúng bằng veth pair có IP/route đúng.
- Implement một Docker-style bridge network from scratch không cần Docker.
- Trace đường gói container ra Internet (SNAT/MASQUERADE) và inbound publish port (DNAT).
- Diagnose sự cố mạng container bằng
nsenter, route/iptables trong netns vàtcpdump.
Lộ trình module
Sáu bài concept + một mini-challenge xếp theo phụ thuộc kỹ thuật — mỗi bước dựng mảnh mà bước sau giả định bạn đã có:
-
Network namespaces — vì sao container thấy mạng riêng — isolation layer. Mỗi netns có interface, route table, iptables ruleset riêng.
ip netns add/execlà lệnh nền của mọi container network mode. -
Nối container bằng veth — ping qua 2 netns — "cáp ảo hai đầu": một đầu trong netns A, một đầu trong netns B (hoặc host). Gán IP, bật
lo/veth, route đúng → ping hai chiều. Không veth = hai namespace cô lập tuyệt đối. -
Mini-challenge — dựng Docker bridge network from scratch — lab capstone module: bridge + nhiều netns + veth + IP/route, không Docker daemon. Đây là outcome "Implement Docker-style bridge" — bằng chứng bạn ghép được plumbing Module 1 trong namespace.
-
Container ra Internet — SNAT và MASQUERADE — private IP container không route được trên Internet. Host rewrite source (POSTROUTING MASQUERADE/SNAT) +
ip_forward. Trace gói từ netns → bridge → host NIC → reply về. -
Publish port — DNAT và
docker -p— chiều ngược: client hit host:8080, kernel DNAT PREROUTING đẩy vào container:80. Map 1-1 vớidocker run -p— giờ bạn đọc rule thay vì tin CLI. -
Debug container networking — nsenter và tcpdump — khi đứt: vào đúng netns (
nsenter/ip netns exec), kiểm route/iptables bên trong, bắt gói trên veth/bridge bằngtcpdump. Checklist triage production.
Bài tổng kết cuối module gom cheat sheet netns/veth/NAT, glossary, và self-assessment khớp bốn outcome trên — bookmark trước khi sang Kubernetes networking.
Yêu cầu trước khi bắt đầu
Kiến thức trong course:
- Module 1 — Linux Network Internals — stack, veth/tun/tap, Linux bridge, iptables/netfilter. Module 2 giả định bạn đọc được
ip link/bridge fdb/iptables -t nat -Lvà biết gói đi qua hook nào. Nếu còn mơ hồ bốn mảnh, quay lại Module 1 trước — lab mini-challenge sẽ rất nặng.
Môi trường thực hành (bắt buộc):
- Linux (máy thật, VM, hoặc WSL2 với network namespace đầy đủ). macOS Docker Desktop không cho cùng view: netns/veth/bridge/iptables là kernel host Linux.
- Quyền root hoặc
sudo— tạo/xóa netns, veth, bridge, bậtip_forward, chèn rule NAT. - iproute2 (
ip,ss, thường sẵn trên distro hiện đại) và iptables (hoặciptables-nftcompat). Lab ghi rõ lệnh; một số distro cầnapt install iproute2 iptables/dnf install iproute iptables. - Terminal quen: copy command, đọc stderr, dọn lab (
ip netns del, xóa bridge) để không để rác interface.
Docker daemon không bắt buộc cho phần lớn bài (mục tiêu là dựng không Docker). Có Docker hữu ích khi so sánh rule daemon chèn với rule bạn tự viết — không phải điều kiện vào module.
Time budget
| Bài | Thời lượng |
|---|---|
| Tổng quan (bài này) | ~8 phút |
| Network namespaces | ~16 phút |
| Nối container bằng veth | ~16 phút |
| Mini-challenge bridge from scratch | ~40 phút |
| Container ra Internet (SNAT) | ~18 phút |
| Publish port (DNAT) | ~16 phút |
| Debug nsenter / tcpdump | ~18 phút |
| Tổng kết & cheat sheet | ~8 phút |
| Tổng module | ~2.5 giờ |
Cách học module này hiệu quả
- Chạy trên Linux có sudo, không chỉ đọc. Netns/veth/NAT chỉ "thấm" khi bạn thấy
ip netns exec … pingfail rồi pass sau khi sửa route/rule. - Bám pipeline 6 bước. Gặp "container không ra net" → hỏi: netns còn iface up? veth còn pair? bridge port learned? SNAT/FORWARD? DNAT đúng port? — rồi mới
tcpdump. - Dọn lab sau mỗi bài. Namespace và bridge sót sẽ đụng tên/IP bài sau. Cuối mỗi lab có cleanup; chạy hết trước khi sang bài mới.
- Mini-challenge trước khi tin "đã hiểu Docker network". Nếu dựng bridge from scratch xong,
docker network inspectchỉ còn là bản đồ bạn đã vẽ bằng tay. - Giữ terminal +
watch -n1 ip -br asong song. Output sống trên máy bạn là bằng chứng, không phải screenshot bài.
Bài tiếp theo: Network namespaces — vì sao container thấy mạng riêng
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên