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。

相关推荐
孤岛悬城20 小时前
42 Ansible-Playbooks 自动化剧本
云计算
孤岛悬城1 天前
41 Ansible 自动化
云计算
孤岛悬城1 天前
44 Docker:安装与容器管理
docker·容器·云计算
gaize12132 天前
如何编写一个简单的服务器应用程序?
服务器·云计算
wanhengidc2 天前
巨椰 云手机 云游戏稳定运行
运维·服务器·arm开发·游戏·云计算
x新观点2 天前
2025年IDC服务商市场观察:博大数据在第三方数据中心排名中表现稳健
大数据·人工智能·云计算
x新观点2 天前
2025年IDC服务商市场深度解析:博大数据荣登第三方数据中心排名前列
大数据·人工智能·云计算
翼龙云_cloud2 天前
阿里云云渠道商:如何选择阿里云 GPU 配置方案?
服务器·人工智能·阿里云·云计算