CGroup 资源控制组 + Docker 网络模式

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

相关推荐
Bruce_Liuxiaowei1 小时前
SOCKS与防火墙:穿透与守护的网络安全协奏曲
网络·安全·web安全·网络安全
IT成长日记2 小时前
【LVS入门宝典】LVS-TUN模式原理与配置:跨越网络界限的负载均衡解决方案
linux·网络·负载均衡·lvs·tun
码路工人2 小时前
第6章:Docker Compose - 多容器应用的编排利器
docker·云原生·容器
“αβ”2 小时前
网络编程套接字(三)---简单的TCP网络程序
linux·服务器·网络·c++·网络协议·tcp/ip·套接字
HCIE考证研究所2 小时前
CCIE网络工程师考哪个方向最好?CCIE选择攻略
网络
会开花的二叉树2 小时前
实战:基于 BRPC+Etcd 打造轻量级 RPC 服务 —— 从注册到调用的完整实现
网络·数据库·c++·rpc·etcd
打不了嗝 ᥬ᭄2 小时前
【Linux】网络基础
linux·运维·网络
敲上瘾3 小时前
HTTP协议工作原理与生产环境服务器搭建实战
服务器·网络·c++·网络协议·http
小马过河R3 小时前
K8s引入Service Mesh原因及Istio入门
云原生·容器·kubernetes·k8s·istio·service_mesh
行者Sun19894 小时前
【K8s】Kubernetes 虚拟机管理工具之 KubeVirt
云原生·容器·kubernetes