在这里插入图片描述

📃个人主页:island1314

⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞

  • 生活总是不会一帆风顺,前进的道路也不会永远一马平川,如何面对挫折影响人生走向 – 《人民日报》


1. 为什么需要 Docker 网络管理?

Docker 容器默认运行在**隔离的网络命名空间(Network Namespace)*中,彼此之间、与宿主机、与外部世界*默认无法通信。然而,真实业务场景中存在大量网络交互需求:

场景 问题 需求
多容器协作 Web 容器如何连接 MySQL 容器? 容器间通信
外部访问服务 如何让浏览器访问容器中的 Nginx? 容器对外暴露服务
容器与宿主机交互 宿主机脚本如何调用容器 API? 容器 ↔ 宿主机通信
安全隔离 某些容器(如日志收集器)不需要网络 完全禁用网络
定制拓扑 需要模拟多子网、VLAN 或集群网络 高级网络定制
性能优化 高频通信场景(如微服务)需低延迟 绕过 NAT,直连网络

结论:Docker 网络管理的核心目标是——在“隔离”与“连通”之间取得平衡,按需提供通信能力,同时保障安全与性能。

2. Docker 网络架构

Docker 容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP路由表、防火墙等等与网络相关的模块。

Docker 为实现容器网络,主要采用的架构由三部分组成:CNM、Libnetwork 和驱动。

2.1 CNM

Docker 网络架构采用的设计规范是 CNM(Container Network Model),其是 Docker 官方提出的容器网络抽象模型,定义了三个核心组件:

组件 作用 类比
Sandbox 容器的完整虚拟网络栈
(含 IP、路由表、DNS、防火墙、网络接口等)
容器的“网络操作系统”
Endpoint 虚拟网络接口,用于接入网络
一个 Endpoint 只能属于一个 Network
容器可有多个 Endpoint(接入多个网络)
容器的“网卡”
Network 虚拟子网,同一 Network 内的容器可直接通信
不同 Network 默认隔离(除非配置路由)
容器的“局域网”

📌 关键理解

  • 容器通过 Endpoint 加入 Network
  • Sandbox 封装了整个网络环境,实现与宿主机隔离;
  • 容器跨网络通信需多 Endpoint网关/路由

CNM 架构示意图

  • 如上图所示,容器 B 有两个 Endpoint 并且分别接入 Networkd A 和 Network B。
  • 那么容器 A 和容器 B 之间是可以实现通信的,因为都接入了 NetworkA。
  • 但是容器 A 和容器 C 不可以通过容器 B 的两个 Endpoint 通信 ——Endpoint 仅用于接入,不具备路由器功能。
2.2 Libnetwork
  • 由 Docker 官方用 Go 语言开发的开源库,是 CNM 的一个标准实现
  • dockerd(Docker Daemon)的核心网络模块
  • 实现了 CNM 全部组件,并扩展了:
    • 本地服务发现(基于 DNS)
    • Ingress 负载均衡(Swarm 模式)
    • 网络控制面与管理面

💡 Libnetwork 是 Docker 支持多种网络驱动的统一接口层


2.3 网络驱动(Drivers)

驱动负责实际创建网络设备、配置路由、实现隔离数据层相关内容)等底层操作。Docker 支持多种内置及第三方驱动:

驱动类型 说明 适用场景
bridge 创建 Linux 网桥(docker0),默认驱动 单机多容器通信
host 容器共享宿主机网络命名空间 高性能、无 NAT 场景
overlay 基于 VXLAN 实现跨主机虚拟网络 Docker Swarm 集群
macvlan 为容器分配真实 MAC 地址,直连物理网络 需要容器像物理机一样接入网络
ipvlan 类似 Macvlan,但共享宿主机 MAC,更节省资源 大规模容器部署
none 不配置任何网络 完全隔离的容器(如离线计算)
第三方驱动 Calico、Flannel、Weave 等 Kubernetes 或高级 CNI 场景

🌐 驱动 = 网络能力的“插件”,Libnetwork 调用驱动创建资源。

3. Docker 常见网络模式

3.1 Bridge 网络(默认模式)
  • 原理

    • Docker 启动时自动创建 docker0 网桥(ip addr show docker0 可查看);
    • 每个容器启动时分配虚拟网卡 veth,一端在容器内(eth0),一端挂到 docker0
    • 容器 IP 默认为 172.17.0.0/16(可自定义子网)。
  • 通信方式

    • 容器 ↔ 容器:同 bridge 网络内,通过 IP 或容器名(Docker 内置 DNS)直接通信;
    • 容器 ↔ 外部:通过 iptables SNAT/DNAT 实现端口映射(-p 8080:80);
    • 外部 ↔ 容器:访问 宿主机IP:8080 → 被转发到容器 80 端口。
  • 优点:隔离性好、配置简单

  • 缺点:跨主机通信需额外方案(如 overlay)

🛠 自定义 bridge 网络(推荐)

docker network create --driver bridge --subnet=172.20.0.0/16 mynet
docker run --network mynet --name web nginx
docker run --network mynet --name db mysql
# web 可直接 ping db
3.2 Host 网络模式
  • 原理:容器不创建 Network Namespace,直接使用宿主机的网络栈;

  • 表现

    • 容器内 ip addr 与宿主机完全一致;
    • 无 NAT、无端口映射,性能最高
    • 容器端口直接占用宿主机端口(如 nginx 监听 80,宿主机 80 就被占)。
  • 适用场景

    • 网络性能敏感(如高性能代理、监控 agent);
    • 需要使用特殊协议(如 raw socket、ICMP)。
  • ⚠️ 风险

    • 端口冲突风险高;
    • 安全隔离弱(网络层面无隔离)。
docker run --network host nginx  # 宿主机 80 端口直接被占用
3.3 Container 网络模式
  • 原理:新容器共享另一个容器的 Network Namespace

  • 表现

    • 两者 IP、端口、网络接口完全一致;
    • 进程可通过 lo(127.0.0.1)互相访问;
    • 文件系统、进程、用户等仍隔离。
  • 典型用途

    • Sidecar 模式:主容器(App) + 监控容器(共享网络,采集 metrics);
    • 调试:运行 netshoot 容器共享目标容器网络,进行 tcpdumpdig 等操作。
docker run -d --name app nginx
docker run -it --network container:app nicolaka/netshoot  # 进入后可直接 curl localhost
3.4 None 网络模式
  • 原理:容器有 Network Namespace,但不配置任何网络设备

  • 表现

    • 容器内只有 lo 接口(127.0.0.1);
    • 无法访问外部,也无法被访问;
    • 完全网络隔离。
  • 适用场景

    • 离线计算任务(如加密、批处理);
    • 安全要求极高的沙箱环境。
docker run --network none alpine ip addr  # 只显示 lo
3.5 Overlay 网络(跨主机通信)
  • 前提:必须使用 Docker Swarm 模式docker swarm init);
  • 原理
    • 基于 VXLAN 封装,实现跨主机 L2 网络;
    • 所有加入 Swarm 的节点自动建立 overlay 网络;
    • 服务发现、负载均衡由 Docker 内置 DNS 和 Ingress 实现。

image.png

  • 特点
    • 容器 IP 在整个集群唯一;
    • 支持加密(--opt encrypted);
    • 服务可通过服务名跨主机访问。
# Swarm manager 上
docker network create --driver overlay my-overlay
docker service create --network my-overlay --name web nginx

🌐 注意:Overlay 不适用于单机 docker run,仅用于 Swarm 服务。

4. Docker 默认网络设备:docker0

  • 安装 Docker 时自动创建的 Linux 网桥(bridge)
  • 默认子网:172.17.0.0/16
  • 所有使用默认 bridge 网络的容器都连接到 docker0
  • 宿主机通过 iptables 规则实现:
    • SNAT:容器访问外网(源地址转为宿主机 IP);
    • DNAT:外部访问容器(通过 -p 映射的端口)。
# 查看 docker0
ip addr show docker0

# 查看 NAT 规则
iptables -t nat -L -n
应用场景
场景 推荐方案
单机多容器通信 自定义 bridge 网络(避免用默认 bridge)
高性能/无 NAT host 网络(慎用)
跨主机容器通信 Docker Swarm + overlay 或 Kubernetes + CNI
调试网络问题 container 模式 + nicolaka/netshoot 镜像
完全隔离 none 网络
暴露服务给外部 -p 端口映射(bridge 模式)或 host 模式
避免端口冲突 使用自定义 bridge + 服务发现(容器名解析)

★,°:.☆( ̄▽ ̄)/$:.°★ 】那么本篇到此就结束啦,如果有不懂 和 发现问题的小伙伴可以在评论区说出来哦,同时我还会继续更新关于【Docker】的内容,请持续关注我 !!

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐