文章目录
- 前言
- 理论部分
-
- 3_Docker网络管理
-
- 3.1_Docker网络实现原理
- 3.2_Docker的网络模式
-
- [① 桥接模式(bridge)](#① 桥接模式(bridge))
- [② 主机模式(host)](#② 主机模式(host))
- [③ 容器模式(container)](#③ 容器模式(container))
- [④ 无网络模式(none)](#④ 无网络模式(none))
- [⑤ 自定义网络模式](#⑤ 自定义网络模式)
- 4_资源限制
-
- [4.1_cgroups 核心功能](#4.1_cgroups 核心功能)
- [4.2_CPU 资源控制](#4.2_CPU 资源控制)
-
- [① 设置 CPU 使用率上限(硬限制)](#① 设置 CPU 使用率上限(硬限制))
- [② 设置 CPU 权重(软限制)](#② 设置 CPU 权重(软限制))
- [③ 绑定 CPU 核(亲和性)](#③ 绑定 CPU 核(亲和性))
- 实验部分
-
- 1_网络模式实验
-
- [1.1_默认 bridge 模式与端口映射](#1.1_默认 bridge 模式与端口映射)
- [1.2_host 网络模式](#1.2_host 网络模式)
- [1.3_container 网络模式](#1.3_container 网络模式)
- [1.4_none 网络模式](#1.4_none 网络模式)
- [1.5_自定义 bridge 网络](#1.5_自定义 bridge 网络)
- 结语
前言
本文档聚焦 Docker 网络管理 与 Docker 资源限制 两大核心章节,深入解析容器网络通信原理、五种网络模式的适用场景,以及基于 Linux cgroups 的 CPU、内存、磁盘 IO 限制机制。
- Docker 默认网桥(docker0)工作原理
- 五种网络模式(bridge/host/container/none/自定义)详解
- 端口映射(-P / -p)实现外部访问
理论部分
3_Docker网络管理
Docker 通过 Linux 虚拟网桥实现容器间及容器与外部网络的通信。
3.1_Docker网络实现原理
Docker 启动时会创建一个名为 docker0 的虚拟网桥(类型:Linux Bridge)。每个新容器启动时:
- 分配一个独立的 Network Namespace。
- 在该命名空间内创建虚拟网卡
eth0。 - 在宿主机创建对应的
veth设备(如vethxxxx),并将一端加入docker0网桥。 - 容器获得一个私有 IP(默认
172.17.0.0/16网段),docker0作为其默认网关。
容器间可通过
Container-IP直接通信;外部网络无法直接访问Container-IP,需通过 端口映射。
3.2_Docker的网络模式
① 桥接模式(bridge)
- 默认模式,等同于 VMware 的 NAT 模式。
- 容器拥有独立网络栈,通过
docker0与宿主机通信。 - 支持端口映射(
-p/-P)暴露服务。 - 局限 :不支持
--ip参数指定静态 IP。
IP: 172.17.0.1] veth1[veth pair] veth2[veth pair] end subgraph 容器1 eth0_1[eth0
IP: 172.17.0.2] end subgraph 容器2 eth0_2[eth0
IP: 172.17.0.3] end docker0 --- veth1 docker0 --- veth2 veth1 --- eth0_1 veth2 --- eth0_2 外部网络 -->|端口映射| 宿主机
② 主机模式(host)
- 容器共享宿主机 Network Namespace。
- 无独立 IP,直接使用宿主机 IP 和端口。
- 优势:网络性能最高(无 NAT 开销)。
- 风险:端口冲突,隔离性弱。
宿主机 共享 直接访问 宿主机 Network Namespace
IP: 192.168.10.23 容器进程 外部网络
③ 容器模式(container)
- 新容器共享另一个容器的 Network Namespace。
- 两者共用 IP、端口、网络设备。
- 用途:调试、监控(如 sidecar 模式)。
- 文件系统、进程等仍相互隔离。
宿主机 使用 使用 通过容器A IP 容器A
PID: 1234 容器B
PID: 5678 共享 Network Namespace
IP: 172.17.0.2 外部网络
④ 无网络模式(none)
- 容器拥有独立 Network Namespace,但不配置任何网络设备。
- 仅存在
lo回环接口。 - 用途:高安全隔离场景,完全禁用网络。
宿主机 隔离 容器 独立 Network Namespace
仅 lo 接口
⑤ 自定义网络模式
Docker 提供三种驱动:
- bridge:增强版默认 bridge,支持 DNS 解析、指定子网/IP。
- overlay:跨主机通信(用于 Docker Swarm)。
- macvlan:容器直接获取物理网络 IP,如同独立物理机。
生产推荐 :使用自定义 bridge 网络,可自动解析容器名到 IP,无需
--link。
4_资源限制
Docker 利用 Linux 内核的 cgroups(Control Groups) 机制实现资源控制。
4.1_cgroups 核心功能
- 资源限制:设定任务使用资源上限。
- 优先级分配:通过权重分配 CPU 时间片、IO 带宽。
- 资源统计:记录 CPU 时长、内存用量等。
- 任务控制:挂起、恢复或终止进程组。
4.2_CPU 资源控制
① 设置 CPU 使用率上限(硬限制)
- 原理:基于 CFS(Completely Fair Scheduler)。
- 参数 :
--cpu-period=100000(默认 100ms 周期)--cpu-quota=50000(配额 50ms → 50% 单核)
- 简化写法 :
--cpus=0.5
注意:在 4 核机器上,
--cpus=0.5≈ 占用整机 12.5% CPU。
② 设置 CPU 权重(软限制)
- 参数 :
--cpu-shares=512(默认 1024) - 行为:仅在 CPU 争用时生效,按权重比例分配时间片。
- 示例:容器 A(512)与 B(1024)争用时,CPU 分配比 ≈ 1:2。
③ 绑定 CPU 核(亲和性)
- 参数 :
--cpuset-cpus="0,2" - 作用:将容器进程固定到指定 CPU 核,避免上下文切换开销,提升性能稳定性。
实验部分
1_网络模式实验
1.1_默认 bridge 模式与端口映射
① 随机端口映射
shell
docker run -d --name test1 -P nginx
-P:自动映射容器暴露的端口(如 80)到宿主机随机高端口(32768+)
② 指定端口映射
shell
docker run -d --name test2 -p 43000:80 nginx
-p <宿主端口>:<容器端口>:手动指定映射关系
③ 验证映射
shell
docker ps -a
输出示例:
0.0.0.0:43000->80/tcp浏览器访问:
http://<宿主IP>:43000
1.2_host 网络模式
① 启动容器
shell
docker run -d --name nginx-host --network host nginx
--network host:使用 host 网络模式,容器共享宿主机网络栈
② 验证
shell
netstat -tuln | grep :80
容器直接监听宿主机 80 端口,无端口转换。
1.3_container 网络模式
① 创建源容器
shell
docker run -itd --name test3 centos:7 /bin/bash
--name test3:为容器指定名称,便于后续引用
② 查看源容器 PID
shell
docker inspect -f '{{.State.Pid}}' test1
# 输出示例:11278
docker inspect:查看容器详细信息
-f '{``{.State.Pid}}':使用 Go 模板提取 PID 字段
③ 查看命名空间
shell
ls -l /proc/11278/ns
/proc/<PID>/ns:存放进程的命名空间符号链接
ini
ipc -> ipc:[4026532538]
mnt -> mnt:[4026532536]
net -> net:[4026532541]
pid -> pid:[4026532539]
user -> user:[4026531837]
uts -> uts:[4026532537]
记录
net -> net:[4026532541]用于对比
④ 创建共享网络的容器
shell
docker run -itd --name test4 --net=container:test3 centos:7 /bin/bash
--net=container:test3:新容器共享 test1 的网络命名空间
⑤ 验证命名空间
shell
docker inspect -f '{{.State.Pid}}' test2
ls -l /proc/<test4_PID>/ns
ini
....
net -> net:[4026532541]
....
两容器
net命名空间编号相同,证明网络共享。
1.4_none 网络模式
① 启动容器
shell
docker run -itd --name test5 --network none centos:7 /bin/bash
--network none:禁用所有网络,仅保留 lo 接口
② 进入容器验证
shell
docker exec -it test5 ip a
ip a:查看网络接口仅显示
lo接口,无eth0。
1.5_自定义 bridge 网络
- 查看初始的docker0虚拟网卡
shell
ip add show docker0
ini
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:d3:4f:cc:0b brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:d3ff:fe4f:cc0b/64 scope link
valid_lft forever preferred_lft forever
① 创建自定义网络
shell
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
docker network create:创建自定义网络
--subnet:指定子网范围
--opt "com.docker.network.bridge.name":指定网桥设备名(便于识别)
mynetwork:网络名称
- 查看自定义的docker1虚拟网卡信息
shell
docker inspect mynetwork
docker network ls # 查看新建的自定义虚拟网卡
ip add show docker1 # 查看自定义的docker1虚拟网卡
② 指定 IP 启动容器
shell
docker run -itd --name test5 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash
--net mynetwork:加入自定义网络
--ip 172.18.0.10:指定容器 IP(默认 bridge 不支持此参数)
③ 验证
shell
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test5
docker exec -it test5 ip a # 查看 IP,依赖包:iproute
ping 172.18.0.1 # ping 网关(docker1)
172.18.0.1是自定义网桥docker1的 IP,即容器默认网关。
结语
网络选型原则:单机开发用默认 bridge,生产环境用自定义 bridge(支持 DNS 和静态 IP),高性能场景用 host 模式。
!question\] 为什么默认 bridge 网络不支持 `--ip` 参数? Docker 默认 bridge (`docker0`) 由内置 IPAM 驱动管理,不支持用户自定义 IP 分配策略;自定义 bridge 使用可配置的 IPAM。