docker网络驱动
Docker 网络驱动是 Docker 容器网络通信的核心机制,负责管理容器之间的连接、隔离和跨主机通信。
Docker 网络驱动的作用
- 网络隔离
通过网络命名空间(Network Namespace)为每个容器提供独立的网络环境,确保容器之间的网络资源互不干扰。 - 容器通信
允许容器之间直接通信,或通过网桥、路由等方式实现跨网络的连接。 - 外部网络访问
通过 NAT(网络地址转换)或端口映射,使容器内的服务可以被外部网络访问。 - 跨主机通信
使用 Overlay 或 Macvlan 等驱动,支持多个 Docker 主机之间的容器网络互通。 - 安全性
通过 IPtables 规则和网络策略(如防火墙)限制容器的网络访问权限。
Docker 网络驱动的分类
docker0
虚拟网桥
Docker 的 docker0
虚拟网桥是 Docker 网络架构的核心组件,它在宿主机上创建一个虚拟交换机(桥接设备),负责管理容器之间的网络通信以及容器与外部网络的交互。
docker0 的作用
- 容器间通信:
docker0
作为虚拟网桥,将所有使用 Bridge 模式的容器连接到同一个私有网络中,容器之间可以通过 IP 地址直接通信。- 容器与宿主机通信:容器通过
docker0
与宿主机的网络栈(如eth0
)进行数据交换。- 外部网络访问:通过 NAT(网络地址转换)实现容器对外部网络的访问,外部网络也可以通过端口映射访问容器服务。
- IP 分配:
docker0
管理容器的 IP 地址分配,通常使用私有网段(如172.17.0.0/16
)。
docker0 的工作原理
网络命名空间
每个容器拥有独立的网络命名空间,隔离其网络资源(如 IP 地址、端口)。
宿主机的默认网络命名空间包含
docker0
网桥和物理网络接口(如eth0
)。veth pair 接口
当容器启动时,Docker 会创建一对虚拟以太网接口(veth pair):
一端在容器内部(通常命名为
eth0
),用于容器的网络通信。另一端在宿主机上,绑定到
docker0
网桥(如vethXXX
)。数据包通过 veth pair 在容器和
docker0
之间双向传输。网桥(docker0)
docker0
是 Linux 的虚拟桥接设备,类似于物理交换机,负责转发连接到它的接口之间的数据包。所有容器的 veth pair 接口都连接到
docker0
,实现容器间的二层网络通信。NAT 与端口映射
出站流量(容器 → 外部网络):
容器的数据包通过
docker0
发送到宿主机的物理接口(如eth0
)。使用 SNAT(源地址转换)将容器的私有 IP 替换为宿主机的公网 IP。
入站流量(外部网络 → 容器):
外部请求通过 DNAT(目的地址转换)将宿主机的端口映射到容器的私有 IP 和端口。
需要通过
-p
参数(如docker run -p 8080:80
)显式配置端口映射。
docker0 的典型配置
默认子网
docker0
默认分配一个私有子网(如172.17.0.0/16
),网关为172.17.0.1
。- 可通过以下命令查看
docker0
的 IP 和子网:ip addr show docker0 # 输出示例: # 4: docker0: <BROADCAST,MULTICAST,UP> mtu 1500 # inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
查看容器的网络配置
使用
docker inspect <容器名>
查看容器的 IP 和网关:docker inspect my_container # 关键字段: # "Networks": { # "bridge": { # "Gateway": "172.17.0.1", # "IPAddress": "172.17.0.2" # } # }
docker0 的网络通信流程
容器间通信
- 容器 A 发送数据包到容器 B 的 IP 地址。
- 数据包通过容器 A 的
eth0
→ veth pair →docker0
网桥。docker0
根据 MAC 地址表将数据包转发到容器 B 的 veth pair →eth0
。容器访问外部网络
- 容器发送数据包到外部 IP(如
8.8.8.8
)。- 数据包通过
docker0
→ 宿主机的物理接口(如eth0
)。- 宿主机的 IPtables 规则执行 SNAT,将源 IP 替换为宿主机的公网 IP。
外部访问容器
- 外部请求发送到宿主机的 IP 和映射端口(如
192.168.1.100:8080
)。- 宿主机的 IPtables 规则执行 DNAT,将目标 IP 和端口转换为容器的私有 IP 和端口(如
172.17.0.2:80
)。- 数据包通过
docker0
→ 容器的eth0
。
1. Bridge(桥接模式)
- 默认驱动:Docker 安装后默认创建
docker0
虚拟网桥。- 工作原理:
- 每个容器启动时会分配一个虚拟网卡(veth pair),一端在容器内(如
eth0
),另一端连接到docker0
网桥。- 容器通过
docker0
网桥与其他容器通信,并通过 NAT 访问外部网络。- 特点:
- 容器间通信:支持。
- 外部访问:需要通过端口映射(
-p
参数)。- 跨主机通信:不支持(需 Overlay 驱动)。
- 适用场景:
- 单主机容器通信(如 Web 应用与数据库容器在同一宿主机)。
- 开发和测试环境。
2. Host(主机模式)
- 无网络隔离:容器直接使用宿主机的网络栈。
- 工作原理:
- 容器共享宿主机的网络命名空间,使用宿主机的 IP 和端口。
- 特点:
- 网络性能高(无额外网络开销)。
- 容器无法与其他容器隔离。
- 适用场景:
- 需要高性能网络的应用(如网络性能测试工具
iperf
)。- 容器需要直接绑定宿主机端口(如高吞吐量的服务)。
3. Overlay(覆盖网络)
- 跨主机通信:基于 VXLAN 技术构建虚拟网络层。
- 工作原理:
- 在多个 Docker 主机之间创建逻辑网络,容器通过 Overlay 网络互通。
- 依赖分布式键值存储(如 Consul、Etcd)同步网络信息。
- 特点:
- 支持跨主机容器通信。
- 需要 Docker Swarm 或 Kubernetes 等集群管理工具。
- 适用场景:
- Docker Swarm 或 Kubernetes 集群中的容器通信。
- 分布式应用部署(如微服务架构)。
4. Macvlan(MAC 地址虚拟化)
- 直接接入物理网络:容器拥有独立的 MAC 地址,像物理设备一样连接到网络。
- 工作原理:
- 容器通过宿主机的物理网卡直接接入网络,无需 NAT。
- 容器可以响应 ARP 请求,直接与外部网络通信。
- 特点:
- 容器 IP 与宿主机在同一子网。
- 需要物理网络支持(如交换机配置 VLAN)。
- 适用场景:
- 传统网络环境集成(如企业内网)。
- 容器需要直接暴露到外部网络(如网络监控工具)。
5. None(无网络模式)
- 完全隔离:容器仅有环回接口(
lo
),无任何网络访问能力。- 适用场景:
- 本地数据处理任务(如离线文件格式转换)。
- 安全敏感场景(如无网络需求的容器)。
Docker 网络驱动的工作原理
Docker 网络驱动的实现依赖于 Linux 的以下技术:
- 网络命名空间(Network Namespace)
每个容器拥有独立的网络命名空间,隔离网络资源(如 IP 地址、端口)。- 虚拟网卡对(veth pair)
容器与网桥之间的通信通过虚拟网卡对实现,一端在容器内,另一端连接到网桥。- 网桥(Bridge)
docker0
是默认的虚拟网桥,负责容器间的数据转发。- IPtables/NAT
通过 NAT 实现容器对外部网络的访问,并通过 IPtables 规则控制流量。- VLAN 和路由
Macvlan 和 Overlay 驱动利用 VLAN 和路由技术实现跨主机通信。
docker network
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
(llm) wangqiang@wangqiang:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
954bd6f21159 bridge bridge local
fbc7275a87d6 docker_default bridge local
7da665420a59 docker_ssrf_proxy_network bridge local
345e33573153 host host local
264371720abf none null local
b83ceea04ce6 ollama_default bridge local
5e6e0e9241f6 wordpress_default bridge localNETWORK ID:网络的唯一标识符(UUID)NAME:
网络的名称。
默认网络(如 bridge、host、none)由 Docker 自动创建。
自定义网络(如 docker_default、ollama_default)通常由用户或工具(如 Docker Compose)创建。DRIVER:网络驱动类型,决定网络的工作方式。
常见驱动类型:
bridge(默认):
单主机容器间的通信。容器通过虚拟网桥(如 docker0)连接,IP 地址由 Docker 自动分配。
示例:docker run --network bridge(默认)。
host:
容器共享宿主机的网络栈,直接使用宿主机的 IP 和端口。
示例:docker run --network host。
null:
容器无网络访问权限,仅保留本地回环接口(lo)。
示例:docker run --network none。
overlay(高级):
用于跨多台 Docker 主机的容器通信(需 Docker Swarm 或 Kubernetes 支持)。
示例:docker network create --driver overlay my_overlay。
macvlan(高级):
容器拥有独立的 MAC 地址,可直接连接物理网络。
示例:docker network create --driver macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my_macvlan。SCOPE:网络的作用范围。
常见值:
local:仅限当前 Docker 主机(默认)。
global:跨多台 Docker 主机(如 overlay 网络)。
# ========================
# 1. 查看所有网络
# ========================
docker network ls # 列出所有Docker网络# ========================
# 2. 创建自定义网络
# ========================
# --driver: 网络驱动类型(bridge/overlay/macvlan)
# --subnet: 指定子网地址
# --gateway: 指定网关
# --ip-range: 指定IP分配范围
docker network create \--driver bridge \ # 使用桥接驱动(单主机默认)--subnet 192.168.100.0/24 \ # 子网范围--gateway 192.168.100.1 \ # 网关地址--ip-range 192.168.100.128/25 \ # IP分配范围my-app-network # 网络名称# ========================
# 3. 容器网络连接管理
# ========================
# 启动容器时连接网络
docker run -d \--name web-server \ # 容器名称--network my-app-network \ # 加入指定网络-p 8080:80 \ # 端口映射(宿主机端口:容器端口)nginx:alpine# 将运行中容器连接到网络
# --ip: 指定静态IP地址
# --alias: 添加网络别名(额外DNS名称)
docker network connect \--ip 192.168.100.50 \ # 分配静态IP--alias web \ # 添加别名webmy-app-network \ # 目标网络existing-container # 容器名称# 从网络断开容器
docker network disconnect my-app-network web-server# ========================
# 4. 网络诊断与检查
# ========================
docker network inspect my-app-network # 查看网络详细信息
docker network inspect --format '{{json .IPAM}}' my-app-network # 仅查看IP配置# 测试容器间通信(需在运行的容器内执行)
docker exec -it web-server ping db-server # 通过容器名通信# ========================
# 5. 网络清理与管理
# ========================
docker network rm my-app-network # 删除指定网络
docker network prune # 清理所有未使用网络
docker network prune --filter "until=24h" # 清理24小时前未使用的网络# ========================
# 6. 多网络连接示例
# ========================
# 创建后端专用网络
docker network create backend-net# 同时连接两个网络
docker run -d \--name my-app \--network my-app-network \ # 主网络(前端访问)--network backend-net \ # 第二网络(数据库通信)--network-alias api \ # 在主网络中的别名my-custom-image# ========================
# 7. 特殊网络类型示例
# ========================
# 主机模式网络(直接使用宿主机网络栈)
docker run -d \--name host-mode-container \--network host \ # 使用host网络模式nginx# MACVLAN网络(直接分配物理网络IP)
docker network create \--driver macvlan \--subnet=192.168.1.0/24 \--gateway=192.168.1.1 \-o parent=eth0 \ # 指定物理接口macvlan-net# ========================
# 8. 容器服务发现
# ========================
# 在自定义网络中自动DNS解析
docker run -d --name database --network my-app-network redis# 在web-server容器中可直接访问:
# ping database
# curl http://database:6379# ========================
# 9. 网络驱动类型速查
# ========================
# bridge : 单主机容器通信(NAT转发,默认类型)
# host : 共享宿主机网络栈(高性能)
# overlay : 多主机集群通信(Swarm模式)
# macvlan : 直接分配物理网络IP
# none : 无网络(只有lo接口)