45 Docker网络管理

文章目录

  • 前言
  • 理论部分
    • 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 限制机制。

  1. Docker 默认网桥(docker0)工作原理
  2. 五种网络模式(bridge/host/container/none/自定义)详解
  3. 端口映射(-P / -p)实现外部访问

理论部分

3_Docker网络管理

Docker 通过 Linux 虚拟网桥实现容器间及容器与外部网络的通信。

3.1_Docker网络实现原理

Docker 启动时会创建一个名为 docker0 的虚拟网桥(类型:Linux Bridge)。每个新容器启动时:

  1. 分配一个独立的 Network Namespace
  2. 在该命名空间内创建虚拟网卡 eth0
  3. 在宿主机创建对应的 veth 设备(如 vethxxxx),并将一端加入 docker0 网桥。
  4. 容器获得一个私有 IP(默认 172.17.0.0/16 网段),docker0 作为其默认网关。

容器间可通过 Container-IP 直接通信;外部网络无法直接访问 Container-IP,需通过 端口映射

3.2_Docker的网络模式

① 桥接模式(bridge)
  • 默认模式,等同于 VMware 的 NAT 模式。
  • 容器拥有独立网络栈,通过 docker0 与宿主机通信。
  • 支持端口映射(-p / -P)暴露服务。
  • 局限 :不支持 --ip 参数指定静态 IP。
graph TD subgraph 宿主机 docker0[虚拟网桥 docker0
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。

相关推荐
翼龙云_cloud5 小时前
阿里云渠道商:如何使用弹性伸缩来实现计算资源的弹性配置?
服务器·阿里云·云计算
落笔画忧愁e9 小时前
实测:利用腾讯云锐驰型 200M 带宽,搭建无门槛高清视频分发系统
云计算·腾讯云
冬天的风滚草11 小时前
揭秘云原生混布资源调度器Koordinator (十五)GPU 信息采集与上报机制
云计算
冬天的风滚草11 小时前
揭秘云原生混布资源调度器Koordinator (十三)GPU 资源管理总览
云计算
冬天的风滚草11 小时前
揭秘云原生混布资源调度器Koordinator (十四)DeviceShare 调度插件详解
云计算
CodeCaptain14 小时前
阿里云ECS上配置Nginx的反向代理
nginx·阿里云·云计算
有谁看见我的剑了?1 天前
VMware OVF Tool 工具安装学习
云计算
盛夏5201 天前
Docker容器化部署SpringBoot+Vue项目:从零到一在阿里云宝塔面板的实践指南
阿里云·docker·云计算
狐571 天前
2026-01-10-云计算问答题部分整理-期末复习
云计算·期末复习
2401_861277552 天前
中国电信星辰AI大模型有哪些主要功能
人工智能·云计算·软件工程·语音识别