Docker 网络模型深度解析:原生模式、自定义网络与容器通信
Docker 网络是容器化应用的核心基础设施,它实现了容器与容器、容器与宿主机、容器与外部网络的互联互通。理解 Docker 网络模型,是构建复杂分布式容器应用的前提。本文将从 Docker 原生网络模式、自定义网络创建与接入、容器间通信与 DNS 解析 三个维度,全面拆解 Docker 网络的工作原理与实战操作。
一、Docker 网络核心原理概述
Docker 采用桥接驱动作为默认网络方案,其底层依赖 Linux 内核的 Network Namespace(网络命名空间)技术,实现容器网络的隔离与互通。
- Network Namespace:每个容器拥有独立的网络命名空间,包含专属的网卡、IP 地址、路由表、防火墙规则,与宿主机及其他容器的网络环境完全隔离。
- Docker 网络驱动:Docker 通过驱动机制实现不同的网络模式,核心驱动包括 bridge、host、container、none,同时支持第三方驱动(如 overlay 用于跨主机通信)。
- 网络命名空间通信:容器与宿主机、容器与容器之间的通信,通过 veth 虚拟网卡对 实现 —— 一端挂载在容器的网络命名空间,另一端挂载在宿主机的网桥或网卡上。
二、Docker 原生网络模式详解
Docker 默认提供 4 种原生网络模式,分别适用于不同的业务场景。我们可以通过 docker network ls 命令查看宿主机上的默认网络:
docker network ls
# 输出示例
NETWORK ID NAME DRIVER SCOPE
abc123456789 bridge bridge local
def098765432 host host local
ghi112233445 none null local
2.1 bridge 模式:默认桥接网络(最常用)
bridge 是 Docker 的默认网络模式,当容器启动时未指定网络模式,会自动连接到 docker0 网桥。
工作原理
实战操作
# 启动 Nginx 容器,默认使用 bridge 模式
docker run -d –name nginx-bridge nginx:1.25
# 查看容器的网络信息
docker inspect nginx-bridge | grep -i ipaddress
# 输出示例:"IPAddress": "172.17.0.2"
# 宿主机 ping 容器(可通)
ping 172.17.0.2
# 容器 ping 宿主机(需 ping 宿主机的 docker0 地址 172.17.0.1)
docker exec nginx-bridge ping 172.17.0.1
适用场景
- 单机环境下的多容器通信(如 Web 容器 + 数据库容器)。
- 不需要暴露大量端口到外部的服务。
优缺点
| 网络隔离性好,容器间互不干扰 | 容器与外部通信需通过 NAT 转发,存在性能损耗 |
| 配置简单,无需手动干预 | 跨主机容器通信复杂,需依赖第三方工具 |
2.2 host 模式:共享宿主机网络
host 模式下,容器不创建独立的网络命名空间,直接共享宿主机的网络栈(网卡、IP 地址、端口)。
工作原理
- 容器启动后,不会分配独立的 IP 地址,其网络配置与宿主机完全一致。
- 容器内的服务直接使用宿主机的端口,无需进行端口映射(-p 参数失效)。
实战操作
# 启动 Nginx 容器,使用 host 模式
docker run -d –name nginx-host –network host nginx:1.25
# 容器内的 Nginx 直接监听宿主机的 80 端口,访问宿主机 IP 即可
curl http://宿主机IP
适用场景
- 对网络性能要求极高的应用(如高并发服务),避免 NAT 转发的性能损耗。
- 需占用宿主机大量端口的服务,简化端口映射配置。
优缺点
| 网络性能最优,无额外转发开销 | 容器与宿主机共享端口,容易出现端口冲突 |
| 配置简单,无需端口映射 | 网络隔离性差,容器可直接访问宿主机的所有网络资源 |
2.3 container 模式:共享其他容器的网络
container 模式下,新创建的容器共享另一个已存在容器的网络命名空间,两个容器拥有相同的 IP 地址和端口配置。
工作原理
- 两个容器共享同一个 Network Namespace,共用一张 eth0 网卡,IP 地址相同。
- 容器之间的通信可通过 localhost 直接完成,无需经过网桥转发。
- 被共享的容器称为 “父容器”,若父容器停止,子容器的网络会失效。
实战操作
# 1. 启动父容器(Nginx)
docker run -d –name parent-nginx nginx:1.25
# 2. 启动子容器(Alpine),共享父容器的网络
docker run -it –name child-alpine –network container:parent-nginx alpine:3.18
# 3. 在子容器中访问父容器的 Nginx 服务(通过 localhost:80)
wget -qO- localhost
适用场景
- 容器间需要极致高效通信的场景(如日志收集容器与应用容器)。
- 需共享网络配置的辅助容器(如监控容器、调试容器)。
优缺点
| 容器间通信延迟极低,无需网络转发 | 子容器依赖父容器,父容器停止则子容器网络失效 |
| 节省网络资源,无需额外分配 IP | 两个容器共享端口,不能同时监听相同端口 |
2.4 none 模式:无网络模式
none 模式下,Docker 只为容器创建独立的 Network Namespace,但不配置任何网络参数(无网卡、无 IP 地址、无路由)。
工作原理
- 容器启动后,默认只有一个 lo(回环)网卡,无法与外部通信。
- 需手动为容器配置网卡、IP 地址和路由规则,才能实现网络互通。
实战操作
# 启动容器,使用 none 模式
docker run -it –name nginx-none –network none nginx:1.25
# 查看容器网卡(只有 lo 回环网卡)
docker exec nginx-none ip addr
适用场景
- 不需要网络的离线应用(如数据计算、文件处理容器)。
- 需要完全自定义网络配置的场景(如手动配置 VLAN、VPN)。
优缺点
| 网络隔离性最高,完全与外部隔离 | 配置复杂,需手动管理网络参数 |
| 避免网络攻击和干扰 | 默认无法与外部通信,灵活性低 |
2.5 原生网络模式对比总结
| bridge | 高 | 由 docker0 分配 | 通过 docker0 网桥互通 | 需端口映射(-p) | 单机多容器常规应用 |
| host | 无 | 共享宿主机 IP | 与宿主机进程共享网络 | 直接使用宿主机端口 | 高性能、高并发服务 |
| container | 中(与父容器共享) | 共享父容器 IP | 通过 localhost 互通 | 依赖父容器的网络配置 | 容器间极致通信、辅助容器 |
| none | 极高 | 无(需手动配置) | 仅回环网卡 | 默认不可访问 | 离线应用、自定义网络 |
三、自定义网络创建与容器接入
Docker 原生的 bridge 网络虽然方便,但存在DNS 解析不支持容器名、网络配置不可定制等问题。通过创建自定义网络,可以解决这些痛点,同时实现更灵活的网络管理。
3.1 自定义网络的核心优势
3.2 自定义 bridge 网络实战
1. 创建自定义 bridge 网络
使用 docker network create 命令创建,支持指定网段、网关、子网掩码等参数。
# 创建名为 my-bridge 的自定义网络,指定网段 192.168.100.0/24,网关 192.168.100.1
docker network create \\
–driver bridge \\
–subnet 192.168.100.0/24 \\
–gateway 192.168.100.1 \\
my-bridge
2. 查看自定义网络信息
docker network inspect my-bridge
输出中会包含网络的驱动类型、网段、网关,以及已接入的容器列表。
3. 容器接入自定义网络
有两种方式让容器接入自定义网络:
- 启动容器时指定网络 # 启动 nginx1 容器,接入 my-bridge 网络
docker run -d –name nginx1 –network my-bridge nginx:1.25# 启动 nginx2 容器,接入 my-bridge 网络
docker run -d –name nginx2 –network my-bridge nginx:1.25 - 运行中容器接入网络 # 启动一个未指定网络的容器
docker run -d –name nginx3 nginx:1.25# 将 nginx3 接入 my-bridge 网络
docker network connect my-bridge nginx3
4. 容器退出自定义网络
# 将 nginx3 退出 my-bridge 网络
docker network disconnect my-bridge nginx3
3.3 自定义网络的高级配置
1. 为容器分配固定 IP
默认情况下,容器的 IP 由 Docker 自动分配,重启容器后可能变化。通过自定义网络,可指定容器的固定 IP。
docker run -d \\
–name nginx-fixed-ip \\
–network my-bridge \\
–ip 192.168.100.10 \\
nginx:1.25
2. 容器接入多个网络
一个容器可以同时接入多个网络,实现跨网络通信。
# 容器 nginx1 已接入 my-bridge 网络,再接入默认 bridge 网络
docker network connect bridge nginx1
# 查看容器的网络信息(会显示两个网卡)
docker inspect nginx1 | grep -A 10 "Networks"
四、容器间通信与 DNS 解析
容器间通信是分布式应用的核心需求,Docker 提供了 IP 通信、容器名 DNS 通信、服务发现 三种方式,其中 DNS 通信是最推荐的方式。
4.1 方式一:基于 IP 地址通信(不推荐)
在 bridge 模式下,容器可通过彼此的 IP 地址通信,但存在明显缺陷:
- IP 地址由 Docker 自动分配,容器重启后可能变化。
- 大规模容器环境下,管理 IP 地址成本极高。
实战示例
# 查看 nginx1 的 IP 地址
docker inspect nginx1 | grep -i ipaddress
# 输出:"IPAddress": "192.168.100.2"
# 在 nginx2 中 ping nginx1 的 IP
docker exec nginx2 ping 192.168.100.2
4.2 方式二:基于容器名的 DNS 解析(推荐)
自定义网络内置 DNS 服务器,容器接入自定义网络后,可直接通过容器名通信,无需关注 IP 地址。
核心原理
- Docker 在自定义网络中内置了 DNS 服务(默认监听 127.0.0.11)。
- 容器启动时,Docker 会将容器名和 IP 地址的映射关系写入 DNS 服务器。
- 容器内的 DNS 配置指向 127.0.0.11,访问容器名时会自动解析为对应 IP。
实战示例
# 在 nginx2 容器中,通过容器名 ping nginx1(可通)
docker exec nginx2 ping nginx1
# 在 nginx2 中访问 nginx1 的 Web 服务
docker exec nginx2 curl http://nginx1
注意:原生的 bridge 网络不支持容器名 DNS 解析,只有自定义网络才支持。
4.3 方式三:基于 Docker Compose 的服务发现(大规模场景)
在多容器应用(如 Web + 数据库 + 缓存)中,使用 Docker Compose 可以实现更强大的服务发现 —— 通过 services 定义的服务名,容器间可直接通信。
实战示例(docker-compose.yml)
version: '3.8'
services:
web:
image: nginx:1.25
networks:
– my-compose-network
db:
image: mysql:8.0
environment:
– MYSQL_ROOT_PASSWORD=123456
networks:
– my-compose-network
networks:
my-compose-network:
driver: bridge
ipam:
config:
– subnet: 192.168.200.0/24
启动服务后,web 容器可直接通过 db 访问数据库服务:
# 进入 web 容器,访问 db 服务的 3306 端口
docker exec -it 容器名 curl db:3306
4.4 容器与外部网络通信
容器访问外部网络(如互联网),依赖宿主机的 NAT 转发 和 iptables 规则,Docker 会自动配置相关规则,无需手动干预。
关键配置
- 宿主机需开启 ip_forward 内核参数(Docker 启动时会自动开启): sysctl net.ipv4.ip_forward
# 输出:net.ipv4.ip_forward = 1 - Docker 会在宿主机的 iptables 中添加 POSTROUTING 链规则,实现容器的 NAT 转发。
五、Docker 网络运维最佳实践
docker exec -it nginx1 tcpdump -i eth0 port 80
网硕互联帮助中心




评论前必须登录!
注册