Docker 网络是容器通信的核心基础,它允许容器之间、容器与主机之间以及容器与外部网络之间进行数据交互。Docker 提供了多种网络驱动类型,适用于不同场景,下面详细介绍 Docker 网络的设置方式。
一、Docker 网络的基本概念
Docker 网络通过驱动程序(Driver) 实现不同的网络模式,核心作用是:
- 隔离容器网络环境
- 实现容器间通信
- 控制容器与外部网络的连接
Docker 安装后会自动创建 3 种默认网络,可通过 docker network ls
查看:
# 查看所有网络
docker network ls
默认网络包括:
bridge
:默认网络,单机容器间通信(最常用)host
:容器直接使用主机网络栈(无网络隔离)none
:禁用容器网络(完全隔离)
二、自定义网络的创建(核心操作)
默认网络功能有限,实际场景中通常需要创建自定义网络。通过 docker network create
命令创建,支持多种驱动类型,常用参数如下:
参数 | 说明 |
---|---|
--driver 或 -d | 指定网络驱动(如 bridge、overlay 等) |
--subnet | 配置子网(如 192.168.0.0/16) |
--gateway | 配置网关 IP |
--ip-range | 分配容器的 IP 范围(如 192.168.1.0/24) |
--opt 或 -o | 驱动特定的选项(如桥接名称) |
--name | 自定义网络名称 |
1. Bridge 网络(最常用,单机容器通信)
Bridge 是默认驱动,适合同一主机内的容器通信,支持 DNS 解析(容器可通过名称互访)。
创建自定义 bridge 网络:
# 基础创建(自动分配子网)
docker network create my-bridge-net# 自定义子网、网关和 IP 范围
docker network create \--driver bridge \--subnet 172.20.0.0/16 \ # 子网--gateway 172.20.0.1 \ # 网关--ip-range 172.20.1.0/24 \ # 容器 IP 范围--opt "com.docker.network.bridge.name"="my-bridge" \ # 自定义桥接设备名my-custom-bridge
特点:
- 容器默认分配该网络的 IP(可通过
--ip
指定固定 IP) - 支持容器名称互访(如容器
app1
可直接 pingapp2
) - 与默认 bridge 相比,安全性更高(默认隔离,需显式连接)
2. Host 网络(无网络隔离)
Host 驱动让容器直接使用主机的网络栈(IP、端口与主机共享),性能最优但无隔离性。
创建 host 网络(通常无需手动创建,直接使用默认 host 网络):
# 使用默认 host 网络运行容器(无需创建)
docker run -d --network host --name my-host-app nginx
特点:
- 容器无需端口映射(直接使用主机端口,如容器的 80 端口即主机的 80 端口)
- 适合对网络性能要求极高的场景(如高频通信服务)
- 安全性低(容器直接暴露在主机网络中)
3. Overlay 网络(跨主机容器通信)
Overlay 驱动用于跨主机的容器通信(需 Docker Swarm 集群环境),通过 VXLAN 技术实现跨主机数据传输。
创建步骤:
-
初始化 Swarm 集群(需至少 1 个管理节点):
docker swarm init --advertise-addr 主机IP # 管理节点初始化
-
创建 overlay 网络:
docker network create \--driver overlay \--attachable \ # 允许非 Swarm 服务的容器连接--subnet 10.0.0.0/24 \my-overlay-net
特点:
- 跨主机容器可直接通信(无需复杂路由配置)
- 支持加密(通过
--opt encrypted
开启数据加密) - 依赖 Swarm 集群(单主机无需使用)
4. Macvlan 网络(容器模拟物理设备)
Macvlan 允许为容器分配物理网卡级别的 MAC 地址,让容器像独立物理设备一样接入网络(适合需要固定网络标识的场景)。
创建 macvlan 网络:
docker network create \--driver macvlan \--subnet 192.168.1.0/24 \--gateway 192.168.1.1 \--opt parent=eth0 \ # 绑定主机物理网卡(如 eth0)my-macvlan-net
特点:
- 容器拥有独立 MAC 和 IP(与物理设备在同一网络)
- 适合需要被外部网络直接识别的场景(如网络设备模拟)
- 需主机网卡支持(部分虚拟网卡可能不兼容)
5. None 网络(完全禁用网络)
None 驱动完全禁用容器网络,适合无需网络的离线任务(如数据处理脚本)。
使用方式(无需创建,直接使用默认 none 网络):
docker run -d --network none --name no-network-app busybox sleep 3600
三、容器与网络的关联操作
1. 运行容器时连接网络
# 连接到指定网络(可同时连接多个网络)
docker run -d \--name my-app \--network my-bridge-net \ # 主网络--network-alias app1 \ # 网络内别名(用于 DNS 解析)nginx# 为容器指定固定 IP(仅自定义网络支持)
docker run -d \--name fixed-ip-app \--network my-bridge-net \--ip 172.20.1.10 \ # 需在网络的 ip-range 范围内nginx
2. 为运行中的容器添加/移除网络
# 连接到新网络
docker network connect my-overlay-net my-app# 从网络断开
docker network disconnect my-overlay-net my-app
四、网络管理与调试
1. 查看网络详情
docker network inspect my-bridge-net # 查看网络配置、关联的容器等
2. 删除网络
# 先断开所有容器连接,再删除
docker network rm my-bridge-net
3. 测试容器间通信
# 在容器内 ping 另一容器(通过名称或 IP)
docker exec -it my-app ping app1 # 基于网络别名通信
五、实践
- 优先使用自定义 bridge 网络:相比默认 bridge,支持 DNS 名称解析,隔离性更好。
- 跨主机用 overlay:配合 Swarm 或 Kubernetes 实现集群网络。
- 减少 host 网络使用:无隔离性,可能导致端口冲突。
- 固定 IP 谨慎使用:动态分配更符合容器弹性伸缩特性,固定 IP 适合特殊场景(如服务注册)。