1. 容器网络管理的必要性与核心挑战
在容器化技术体系中,网络管理是维持系统稳定性与安全性的基石。默认情况下,Docker 容器与宿主机、以及容器之间处于高度隔离的状态。这种隔离性虽然保障了安全性,但在实际应用场景中,孤立的容器无法创造价值。因此,构建一个灵活、高效且可控的网络环境,必须解决以下核心问题:
- 多容器间通信:在微服务架构中,分布式部署的多个容器实例(如前端服务与后端API)需要通过稳定可靠的链路进行数据交互。
- 容器与宿主机通信:容器内部进程往往需要访问宿主机的资源,或者宿主机需要监控和管理容器内部状态。
- 容器与外部网络通信:运行在容器内的Web应用、数据库服务必须能够被外部互联网或局域网内的其他主机访问。
- 服务暴露与端口映射:如何将Nginx、Redis等服务的端口映射到宿主机,使得外部流量能够准确路由至容器内部。
- 网络隔离策略:在多租户或多环境(开发、测试、生产)场景下,如何防止不同业务线的容器网络相互干扰。
- 特殊网络需求:当容器不需要网络堆栈,或者需要定制化的集群网络(如Overlay网络)时,系统应提供相应的配置能力。
上述问题的解决方案构成了Docker网络管理的核心内容。
2. Docker 网络架构体系
Docker 的网络架构并非简单的端口转发,而是基于操作系统底层特性构建的一套完整虚拟化环境。它允许应用从宿主机操作系统的网络环境中独立出来,拥有独立的网络设备、IP协议栈、端口套接字、IP路由表以及防火墙规则。
Docker 网络架构主要由三部分组成:CNM(Container Network Model)、Libnetwork 以及驱动(Driver)。
2.1 CNM(容器网络模型)
CNM 是 Docker 网络架构的设计规范与理论基础。它抽象出了容器网络的三大核心要素:Sandbox(沙箱)、Endpoint(端点)和 Network(网络)。

上图展示了 CNM 的逻辑拓扑结构,具体解析如下:
-
Sandbox(沙箱) :
沙箱包含了一个容器的网络栈配置,包括网络接口管理、路由表、DNS设置等。沙箱的实现通常利用了Linux的Network Namespace技术。其主要职能是构建一个独立的网络环境,将容器网络与宿主机网络以及其他容器网络进行隔离。图中每个长方形容器框内部即代表一个独立的Sandbox环境。
-
Network(网络) :
Network 代表 Docker 内部的一个虚拟子网。它是一组互连的端点的集合,使得网络内的参与者能够进行通信。不同的 Network 之间默认是隔离的。图中的 "Network A" 和 "Network B" 代表两个不同的网段。
-
Endpoint(端点) :
Endpoint 是虚拟网络的接口,其作用类似于传统物理网络中的网卡或网络适配器。Endpoint 负责将 Sandbox 连接到 Network 上。一个 Endpoint 只能属于一个网络,但一个 Sandbox 可以包含多个 Endpoint。
架构深度解读 :
如上图所示,容器 B 拥有两个 Endpoint,分别接入了 "Network A" 和 "Network B"。
- 连通性:容器 A 和容器 B 都接入了 Network A,因此它们之间可以进行网络通信。
- 隔离性:容器 C 仅接入了 Network B,因此容器 A 与容器 C 无法直接通信,实现了网络层面的隔离。
- 多宿主能力:容器 B 充当了跨网段的角色(类似双网卡主机),它可以分别与 A 和 C 通信,但这并不意味着 A 和 C 可以通过 B 自动路由,除非在 B 中配置了转发规则。
2.2 Libnetwork
Libnetwork 是 CNM 标准的官方实现,采用 Go 语言编写,是 Docker 核心代码库的一部分。它实现了 CNM 定义的 Sandbox、Endpoint 和 Network 组件,并提供了以下高级功能:
- 本地服务发现:允许容器通过名称解析彼此的 IP 地址。
- Ingress 负载均衡:在 Swarm 模式下,分发外部流量到集群内的服务。
- 控制层与管理层:分离了网络的配置管理与数据平面的转发逻辑。
2.3 驱动(Driver)
驱动层负责实现具体的数据传输和隔离逻辑。Docker 通过插件化的驱动机制来扩展网络栈,不同的驱动对应不同的网络拓扑和使用场景。
- Bridge Driver:默认驱动,用于单机网络桥接。
- Host Driver:直接使用宿主机网络栈。
- Overlay Driver:用于跨主机的集群网络通信。
- MacVLan / IPVLan:允许容器直接连接到物理网络,拥有独立的 MAC 或 IP 地址。
- None Driver:禁用网络。
3. 常见网络类型详解
Docker 提供了多种网络模式以适应不同的应用场景:
-
Bridge 网络(桥接模式)
这是 Docker 容器的默认网络驱动。当 Docker 服务启动时,会在宿主机上创建一个名为
docker0的虚拟网桥。新创建的容器默认连接到这个网桥上。网桥相当于一个虚拟交换机,连接在同一网桥上的容器可以通过 IP 地址相互通信。若需外部访问,则需通过 NAT(网络地址转换)和端口映射(Port Mapping)实现。 -
Host 网络(主机模式)
在此模式下,容器不会获得独立的 Network Namespace,而是与宿主机共享网络堆栈。容器将直接使用宿主机的 IP 地址和端口,不再进行 NAT 转换。
- 优点:传输效率高,无 NAT 损耗。
- 缺点:容器端口与宿主机端口直接冲突,隔离性差。
-
Container 网络(容器模式)
这是一种特殊的网络模式,新创建的容器与一个已存在的容器共享同一个 Network Namespace。新旧容器共享 IP 地址、端口范围和路由表,但在文件系统、进程列表等方面依然保持隔离。这与 Kubernetes 中的 Pod 概念类似,常用于 "Sidecar" 边车模式,例如日志收集代理与主业务容器共享网络。
-
None 网络
容器拥有独立的 Network Namespace,但 Docker 不会为其进行任何网络配置(无网卡、无 IP、无路由)。容器内部只有 loopback 接口。
- 适用场景:由于完全隔离,适用于对安全性要求极高且不需要联网的离线计算任务。
-
Overlay 网络(覆盖网络)
Overlay 网络是构建跨主机容器集群通信的关键技术。它利用 VXLAN 等隧道技术,将多个 Docker Daemon 连接在一起,形成一个逻辑上的扁平网络。

上图展示了 Overlay 网络的工作原理。底层的物理基础设施(Infrastructure)可能分布在不同的机房或云区域,但上层的 Overlay Network 为容器屏蔽了底层差异。容器感知的网络是连通的,无论它们实际运行在哪台物理主机上,这对于 Docker Swarm 或 Kubernetes 等编排工具至关重要。
4. Docker 网络管理命令实战
Docker 提供了一套完整的 docker network 子命令集用于网络生命周期管理。
4.1 命令清单概览
| 命令 | 别名 | 功能描述 |
|---|---|---|
docker network create |
- | 创建一个新的网络 |
docker network connect |
- | 将正在运行的容器连接到某个网络 |
docker network disconnect |
- | 将容器从某个网络中断开 |
docker network ls |
list |
列出宿主机上所有的网络 |
docker network prune |
- | 清理所有未被容器使用的网络资源 |
docker network inspect |
- | 查看网络的详细配置信息(JSON格式) |
docker network rm |
remove |
删除一个或多个指定的网络 |
4.2 网络列表查看 (ls)
执行 docker network ls 可以查看当前环境下的网络列表。
bash
docker network ls

上图显示了 Docker 安装后的默认网络配置:
- bridge:默认的桥接网络,驱动为 bridge,作用域为 local。
- host:主机网络模式,驱动为 host。
- none :无网络模式,驱动为 null。
NETWORK ID 是网络的唯一标识符,SCOPE 表示该网络的作用范围(local 表示仅限本机)。
4.3 创建自定义网络 (create)
使用 docker network create 可以创建自定义网络,支持指定驱动、子网段、网关等高级参数。
基本语法:
bash
docker network create [OPTIONS] NETWORK
关键参数解析:
-d, --driver:指定网络驱动(如 bridge, overlay, macvlan),默认为 bridge。--gateway:手动指定主网关地址。--subnet:使用 CIDR 格式指定子网范围(例如 192.168.0.0/16)。--ipv6:启用 IPv6 支持。
操作示例 :
创建一个名为 mynet1 的网络,并指定子网为 192.168.0.0/16。
bash
docker network create mynet1 --subnet=192.168.0.0/16

如图所示,命令执行成功后返回了一串长字符,即新创建网络的完整 ID。该操作在宿主机底层可能会创建一个新的虚拟网桥接口。
4.4 查看网络详情 (inspect)
为了验证网络配置或排查故障,需使用 docker network inspect 查看网络的元数据。
bash
docker network inspect mynet1

上图展示了 mynet1 的详细信息(JSON 格式):
- Name: mynet1
- Id: 网络的完整 ID。
- IPAM : IP 地址管理配置,可以看到 Driver 为
default,Config 中包含了之前指定的 Subnet192.168.0.0/16。Docker 自动分配了网关192.168.0.1。 - Containers: 当前为空,表示尚无容器加入该网络。
同样,可以查看默认 bridge 网络的信息:
bash
docker network inspect bridge

上图展示了默认 bridge 网络的详情。通常默认网段为 172.17.0.0/16,网关为 172.17.0.1。这是所有未指定网络容器的默认归属地。
4.5 动态连接容器与网络 (connect)
docker network connect 允许将一个正在运行的容器加入到另一个网络中,实现容器的多网络接入(Multi-homing)。这会在容器内部增加一个新的网络接口。
操作步骤演示:
-
创建新网络 :创建一个名为
mynet2的网络,子网为10.2.0.0/16。bashdocker network create mynet2 --subnet=10.2.0.0/16
-
启动测试容器 :启动一个名为
busybox1的容器,默认连接到bridge网络。bashdocker run -dit --name busybox1 busybox
-
查看容器当前网络:进入容器内部查看网卡。
bashdocker exec -it busybox1 sh ifconfig
上图显示容器当前只有
eth0网卡,IP 地址属于172.17网段(默认 bridge 网段)。 -
执行连接操作 :将
busybox1连接到mynet2。bashdocker network connect mynet2 busybox1 ifconfig
再次查看容器网络,上图清晰地显示多出了一个 eth1 接口,其 IP 地址位于
10.2网段。此时,该容器同时具备了与两个不同子网通信的能力。 -
验证网络状态 :查看
mynet2的详情。bashdocker network inspect mynet2
在
Containers字段下,可以清楚地看到busybox1已经被注册在网络中,并分配了具体的 IPv4 和 MacAddress。
4.6 断开网络连接 (disconnect)
当容器不再需要访问特定网络时,使用 docker network disconnect 将其移除。
操作演示 :
将 busybox1 从 mynet2 网络中移除。
bash
docker network disconnect mynet2 busybox1
验证结果 :
再次进入容器查看:
bash
docker exec -it busybox1 sh
ifconfig

图中显示,eth1 接口已经消失,容器回到了仅连接默认 bridge 网络的状态。
查看网络详情确认:
bash
docker network inspect mynet2

此时,Containers 字段变为空对象 {},表明网络中已无节点。
4.7 清理网络资源 (prune)
随着时间的推移,系统中可能残留大量未使用的自定义网络。docker network prune 用于一键清理这些孤立资源。
bash
docker network prune

上图展示了命令执行过程。系统会提示将删除所有未被容器引用的自定义网络。确认后,命令输出了被删除的网络名称(如 mynet1, mynet2)。再次执行 ls 可以看到列表已净化。
4.8 删除指定网络 (rm)
docker network rm 用于精准删除指定的网络。
约束条件:如果一个网络正被某个容器使用(即容器连接在该网络上),则无法直接删除。
操作演示:
-
创建三个测试网络:
001,002,003。bashdocker network create 001 # ... 重复操作
-
将容器
busybox1连接到网络003。bashdocker network connect 003 busybox1 docker inspect 003
上图确认
busybox1已在003网络中。 -
尝试批量删除。
bashdocker network rm 001 002 003
上图展示了关键的错误信息:
001和002被成功删除并返回了 ID,但删除003时报错,提示网络通过端点被容器占用(active endpoints)。这体现了 Docker 对网络资源依赖关系的保护机制。 -
最终查看。
bashdocker network ls
列表中仅剩下默认网络和未被删除的
003。
4.9 高级列表查询 (ls 进阶)
docker network ls 支持多种参数以优化输出展示。
-
过滤器 (-f) :
筛选名称包含 "host" 的网络:
bashdocker network ls -f name=host
结果仅显示了 host 网络。
-
格式化输出 (--format) :
将结果输出为 JSON 格式,便于脚本解析:
bashdocker network ls --format json
-
完整 ID 显示 (--no-trunc) :
不截断网络 ID,显示完整的 SHA256 哈希值:
bashdocker network ls --no-trunc
5. 综合案例:网络隔离与网关分析
本节通过对比实验,深入理解自定义网络与默认 Bridge 网络的差异。
5.1 自定义网络的创建与加入
首先,创建一个指定子网的自定义网络 001。
bash
docker network create 001 --subnet=10.15.0.0/16

创建容器 busybox1 并直接指定加入 001 网络(推荐方式,优于先创建后连接)。
bash
docker run -itd --network 001 --name busybox1 busybox

验证配置:
bash
docker inspect 001

从网络视角看,容器已分配 IP 10.15.0.2。
bash
docker inspect busybox1

从容器视角看,NetworkSettings 中明确标注了 Gateway 为 10.15.0.1,IPAddress 为 10.15.0.2。
5.2 默认 Bridge 网络的行为
创建另一个容器 busybox2,不指定任何网络参数。
bash
docker run -itd --name busybox2 busybox

检查其网络配置:
bash
docker inspect busybox2

上图显示,容器自动加入了名为 bridge 的网络。
查看宿主机上的 docker0 网关信息(这通常是默认 bridge 的实体)。

在宿主机执行 ifconfig,可以看到 docker0 接口,其 IP 通常为 172.17.0.1。

通信原理 :如果不指定网络,所有容器都在 docker0 网桥下,它们之间可以通过 IP 直接通信。但自定义网络提供了更好的隔离性和 DNS 解析功能(允许通过容器名通信,而默认 bridge 只能通过 IP)。
5.3 跨网络连接与拓扑变更
现在将运行在默认网络的 busybox2 接入到自定义网络 001 中。
bash
docker network connect 001 busybox2
检查 001 网络状态:
bash
docker inspect 001

上图是关键的拓扑展示:Containers 列表中现在包含了两个对象,busybox1 (10.15.0.2) 和 busybox2 (10.15.0.3)。这意味着尽管 busybox2 最初属于默认网络,但现在它也成为了 001 网络的一员,可以与 busybox1 进行二层通信。
最后,断开 busybox1 与 001 的连接进行清理。
bash
docker network disconnect 001 busybox1

操作完成后,busybox1 将失去 001 网段的访问权限。
6. 总结
Docker 网络管理是容器化运维的核心技能。通过 CNM 模型和丰富的驱动支持,Docker 能够构建复杂的网络拓扑。
- 隔离性:通过 Namespace 和 Bridge 实现容器间的安全隔离。
- 连通性 :通过
connect命令实现灵活的多网段接入。 - 可观测性 :通过
ls和inspect命令全方位监控网络状态。 - 生命周期管理 :通过
create,prune,rm维护网络资源的整洁。
掌握这些基础命令与原理,能够帮助开发者和运维人员在构建微服务架构、处理复杂的容器间通信以及进行故障排查时游刃有余。