【Docker#10】Docker 网络概述(为什么需要网络管理 | 网络架构 | 网络模式)
本文详细介绍了Docker网络管理的关键概念和实现方式。主要内容包括: Docker网络必要性:容器默认隔离的网络环境需要通过Docker网络实现容器间通信、服务暴露、宿主机交互等需求。 核心架构: CNM(Container Network Model)模型定义了Sandbox、Endpoint和Network三大组件 Libnetwork作为CNM的具体实现 多种网络驱动(bridge、hos

📃个人主页: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 或 网关/路由。

- 如上图所示,容器 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(可自定义子网)。
- Docker 启动时自动创建
-
通信方式:
- 容器 ↔ 容器:同 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容器共享目标容器网络,进行tcpdump、dig等操作。
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 实现。

- 特点:
- 容器 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】的内容,请持续关注我 !!

更多推荐


所有评论(0)