1 CGroup 資源控制組
1.1 為什么需要 CGroup
- 容器本質 = 宿主機上一組進程 ?
- 若無資源邊界,一個暴走容器即可拖垮整機?
- CGroup 提供**內核級硬限制**,比 `ulimit`、`nice` 更可靠
1.2 核心概念 3 件套
| 概念 | 一句話解釋 | 查看方式 |
| Hierarchy?| 樹形掛載點,所有子系統掛在同一點 | `mount \| grep cgroup` |
| Subsystem?| 6 大資源控制器(cpu、memory …) | `cat /proc/cgroups` |
| CGroup?| 節點目錄,關聯一組進程 | `ls /sys/fs/cgroup/*/docker/<容器ID>` |
1.3 6 大常用子系統 & Docker CLI 映射
| Subsystem | 作用 | 文件示例 | Docker CLI |
| `cpu` | CPU 時間權重 | cpu.shares | `--cpu-shares` |
| `cpuacct` | CPU 用量統計 | cpuacct.usage | `docker stats` |
| `cpuset` | 綁定核心 | cpuset.cpus | `--cpuset-cpus` |
| `memory` | 內存 + Swap | memory.limit_in_bytes | `-m 200m` |
| `blkio` | 磁盤 I/O 限速 | blkio.throttle.* | `--device-read-bps` |
| `pids` | 最大進程數 | pids.max | `--pids-limit 100` |
1.4 實操必做
bash
# 1. 查看當前掛載
mount | grep cgroup
# 2. 查看容器 123abc 的內存上限
cat /sys/fs/cgroup/memory/docker/123abc*/memory.limit_in_bytes
# 3. 動態修改(root)
echo 104857600 > /sys/fs/cgroup/memory/docker/123abc*/memory.limit_in_bytes
# 4. 熱更新(推薦)
docker update -m 200m 123abc
1.5 高頻錯誤 & 面試考點
- 報錯:?`no space left on device` → 宿主機 `pids.max` 打滿 ?
- Swap 規則:?`memory-swap` ≥ memory,設為 `-1` 表示不限 Swap ?
- K8s 對應:?`limits.memory` 最終仍由 CGroup memory 子系統執行
2 ?Docker 網絡模式
2.1 五種原生網絡模式速記表
| 模式 | 是否隔離 NetNS | 自動 IP | 端口映射(-p) | 場景 |
| bridge?| ? | ? | ? | 單機默認 |
| host?| ? | ? | ? | 追求極致性能 |
| none?| ? | ? | ? | 自定義網絡棧 |
| container?| ?(共享) | ? | ? | sidecar |
| 自定義?| ? | ? | ? | 微服務隔離 |
2.2 bridge 模式流量路徑(文字圖)
容器 → veth → docker0 → iptables NAT → 宿主機物理網卡
2.3 端口映射原理(iptables 兩行規則)
bash
docker run -d -p 8080:80 nginx
- DNAT 進入容器 ?
-A DOCKER ! -i docker0 -p tcp --dport 8080 -j DNAT --to 172.17.0.2:80
- SNAT 回包 ?
-A POSTROUTING -s 172.17.0.2 -p tcp --sport 80 -j MASQUERADE
?2.4 自定義網絡 3 大優勢
1. 內置 DNS:容器名即可互 ping(替代 `--link`) ?
2. 隔離:多網段、多環境 ?
3. 可配置:自定義 `--subnet`、`--ip-range`
2.5 實操:創建并使用自定義網絡
bash
# 1. 新建網絡
docker network create \
--driver bridge \
--subnet 172.20.0.0/16 \
my-net
# 2. 啟動兩容器
docker run -d --name web --network my-net nginx:alpine
docker run -it --rm --name cli --network my-net busybox
/ # ping web
2.6 overlay 跨主機網絡
bash
# manager
docker swarm init --advertise-addr 192.168.1.10
docker network create \
--driver overlay \
--subnet 10.0.0.0/24 \
ov-net
# 部署服務
docker service create --name web --network ov-net -p 80:80 nginx
- 抓包驗證 VXLAN
tcpdump -i eth0 -n udp port 4789 -w vxlan.pcap