Docker 网络详解与实战配置
Docker 网络详解与实战配置
Docker 网络是实现容器间通信、容器与外部网络交互的核心组件。Docker 内置多种网络模式,满足不同场景下的隔离、通信需求。本文将系统讲解 Docker 网络类型、自定义网络配置、容器通信原理及外部访问方案,结合实战操作帮助理解网络机制。
一、Docker 网络核心概念
1.1 网络的作用
Docker 网络的核心目标是解决 “容器如何通信” 问题,具体包括:
- 容器与容器之间的相互访问(如 Web 容器访问数据库容器);
- 容器与宿主机之间的访问(如宿主机访问容器内服务);
- 容器与外部网络(如互联网)的访问(如容器内下载依赖、访问外部 API)。
1.2 网络模式分类
Docker 默认提供 3 种核心网络模式,可通过 --network 参数指定容器使用的网络,也可自定义网络满足特定需求。
| 网络模式 | 名称 | 核心特点 | 适用场景 |
| none | 无网络模式 | 仅保留 lo(本地回环)网卡,无其他网络接口 | 安全性要求极高的场景(如容器仅处理内部逻辑,无需对外通信) |
| host | 主机网络模式 | 共享宿主机的网络栈(IP、端口、路由等),容器无独立 IP | 网络性能要求高的场景(如高性能服务),但需避免端口冲突 |
| bridge | 桥接网络模式 | 容器通过 docker0 网桥与宿主机通信,拥有独立 IP | 默认模式,适用于大多数场景(如多容器协作、对外提供服务) |
二、Docker 默认网络模式实战
2.1 none 模式(无网络)
2.1.1 特性说明
- 容器启动后仅能访问自身(lo 网卡),无法与宿主机、其他容器或外部网络通信;
- 无任何网络配置,安全性最高,但灵活性最差。
2.1.2 操作示例
# 启动 none 模式的容器(使用 busybox 镜像,轻量且含基础命令)
docker run -it --rm --network=none busybox:latest
# 查看容器网络(仅 lo 网卡)
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2.2 host 模式(主机共享网络)
2.2.1 特性说明
- 容器直接使用宿主机的 IP 地址和端口,无需端口映射;
- 容器内的端口占用会与宿主机冲突(如宿主机已用 80 端口,容器无法再绑定 80 端口);
- 网络性能最优(无网桥转发开销),但隔离性差。
2.2.2 操作示例
- 启动 host 模式容器:
# 启动 Nginx 容器,使用 host 网络(共享宿主机 80 端口) docker run -d --rm --network=host --name nginx-host nginx:latest - 验证访问:
-
- 宿主机或外部机器直接访问宿主机 IP(无需指定端口),即可访问容器内的 Nginx 服务:
curl http://宿主机IP # 直接返回 Nginx 默认页面
3.注意端口冲突:
-
- 若宿主机已启动 Nginx(占用 80 端口),再启动上述命令会报错:bind: address already in use,需先停止宿主机 Nginx 或修改容器服务端口。
2.3 bridge 模式(默认桥接网络)
2.3.1 特性说明
- Docker 启动时自动创建 docker0 网桥(默认 IP 段:172.17.0.0/16);
- 每个容器在 bridge 网络下会分配独立 IP(如 172.17.0.2、172.17.0.3);
- 容器通过 docker0 网桥与宿主机通信,对外访问需通过宿主机 NAT 转发。
2.3.2 操作示例
- 查看默认 bridge 网络:
# 查看 Docker 所有网络(默认包含 bridge、host、none) docker network ls # 查看 bridge 网络详情(含 IP 段、关联容器等) docker network inspect bridge - 启动 bridge 模式容器:
# 启动两个 busybox 容器(默认 --network=bridge,可省略) docker run -itd --name box1 busybox:latest docker run -itd --name box2 busybox:latest - 容器间通信(基于 IP):
-
- 查看 box1 的 IP:
docker inspect -f '{{.NetworkSettings.IPAddress}}' box1
# 输出示例:172.17.0.2
-
- 进入 box2 ping box1 的 IP:
docker exec -it box2 sh
/ # ping 172.17.0.2 # 可正常通信(bridge 模式下同一网络容器互通)
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.123 ms
三、自定义网络(bridge 类型)
默认 bridge 网络功能简单(如不支持容器名通信),自定义 bridge 网络可扩展功能(如指定 IP 段、支持容器名解析),更适合生产环境。
3.1 自定义网络创建
3.1.1 核心参数说明
- --driver bridge:指定网络类型为 bridge(默认,可省略);
- --subnet:指定网络的 IP 段(如 172.19.0.0/16);
- --gateway:指定网络的网关(需在 --subnet 范围内,如 172.19.0.1);
- 最后指定网络名称(如 testnetwork)。
3.1.2 操作示例
# 创建自定义 bridge 网络(IP 段 172.19.0.0/16,网关 172.19.0.1)
docker network create \
--driver bridge \
--subnet 172.19.0.0/16 \
--gateway 172.19.0.1 \
testnetwork
# 查看自定义网络(已新增 testnetwork)
docker network ls
3.2 容器指定自定义网络与固定 IP
3.2.1 特性说明
- 自定义网络支持通过 --ip 参数为容器分配固定 IP(需在 --subnet 范围内);
- 自定义网络内置 DNS 服务,支持容器通过 “容器名” 通信(无需记 IP)。
3.2.2 操作示例
- 启动容器并指定自定义网络与固定 IP:
# 启动 box3,使用 testnetwork 网络,固定 IP 172.19.0.100 docker run -itd \ --name box3 \ --network=testnetwork \ --ip 172.19.0.100 \ busybox:latest - 验证固定 IP:
docker inspect -f '{{.NetworkSettings.Networks.testnetwork.IPAddress}}' box3 # 输出:172.19.0.100(与指定 IP 一致) - 容器名通信(自定义网络特有):
-
- 再启动一个容器 box4(使用 testnetwork 网络,不指定 IP):
docker run -itd --name box4 --network=testnetwork busybox:latest
-
- 进入 box3,通过容器名 ping box4:
docker exec -it box3 sh
/ # ping box4 # 自定义网络支持容器名解析,无需 IP
64 bytes from box4.testnetwork (172.19.0.101): seq=0 ttl=64 time=0.089 ms
3.3 容器跨网络通信(多网络绑定)
默认情况下,不同网络的容器无法通信(如 bridge 网络的 box1 与 testnetwork 网络的 box3),可通过为容器 “绑定多个网络” 实现跨网络通信。
3.3.1 操作示例
- 为已启动的容器添加新网络:
# 为 box1(原 bridge 网络)添加 testnetwork 网络 docker network connect testnetwork box1 - 验证跨网络通信:
-
- 进入 box3(testnetwork 网络),ping box1 的 testnetwork IP:
# 查看 box1 在 testnetwork 中的 IP
docker inspect -f '{{.NetworkSettings.Networks.testnetwork.IPAddress}}' box1
# 输出示例:172.19.0.102
# 进入 box3 ping 该 IP
docker exec -it box3 sh
/ # ping 172.19.0.102 # 可正常通信
四、Joined 容器(共享网络栈)
Joined 容器是一种特殊的网络模式,多个容器共享同一个网络栈(IP、端口、网卡),适用于 “多服务共享网络资源” 的场景(如日志收集、监控代理)。
4.1 特性说明
- 所有 Joined 容器共享一个 “主容器” 的网络栈,拥有相同的 IP 和端口;
- 容器间无需通信(共享网络栈,可直接通过 localhost 访问);
- 需注意端口冲突(多个容器不能绑定同一端口)。
4.2 操作示例
- 启动主容器(作为网络栈模板):
# 启动主容器 cy3,使用自定义网络 testnetwork docker run -itd --name cy3 --network=testnetwork busybox:latest - 启动 Joined 容器(共享 cy3 网络栈):
# --network=container:cy3 表示共享 cy3 的网络栈 docker run -it --rm --name cy4 --network=container:cy3 busybox:latest - 验证共享网络栈:
-
- 在 cy4 中查看 IP(与 cy3 一致):
/ # ip a # 输出的 IP 与 cy3 完全相同(如 172.19.0.3)
-
- 在 cy4 中 ping cy3 的容器名(直接解析为 localhost):
/ # ping cy3
PING cy3 (172.19.0.3): 56 data bytes # 与自身 IP 一致
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.056 ms
五、容器网络通信原理
5.1 容器访问外部网络(NAT 转发)
容器默认可访问外部网络(如 ping 百度、下载依赖),核心依赖宿主机的 NAT 地址转换,流程如下:
- 容器(如 172.17.0.3)发送数据包到外部地址(如 www.baidu.com);
- 数据包到达宿主机 docker0 网桥,宿主机内核识别为 “外部访问请求”,触发 NAT 转换;
- NAT 将数据包的源 IP 从容器 IP(172.17.0.3)替换为宿主机网卡 IP(如 192.168.31.106);
- 数据包通过宿主机网卡(如 ens36)发送到外部网络;
- 外部网络返回的数据包通过宿主机 NAT 反向转换(目标 IP 从宿主机 IP 替换为容器 IP),最终送达容器。
验证容器访问外部网络
# 进入容器,ping 百度(可正常通信)
docker exec -it box1 sh
/ # ping www.baidu.com
64 bytes from 110.242.68.66: seq=0 ttl=51 time=28.3 ms
5.2 外部访问容器(端口映射 /host 模式)
容器默认无法被外部网络直接访问(IP 为内网地址),需通过以下两种方式暴露服务:
5.2.1 方式 1:端口映射(bridge 模式)
通过 --publish(简写 -p)参数将容器端口映射到宿主机端口,外部访问宿主机端口即可间接访问容器。
操作示例:
# 启动 Nginx 容器,将容器 80 端口映射到宿主机 8080 端口
docker run -d --rm --name nginx-bridge -p 8080:80 nginx:latest
# 外部访问(宿主机/其他机器)
curl http://宿主机IP:8080 # 返回 Nginx 默认页面
端口映射格式:
- 宿主机端口:容器端口(如 8080:80):宿主机 8080 端口对应容器 80 端口;
- 宿主机IP:宿主机端口:容器端口(如 192.168.31.106:8080:80):指定宿主机特定 IP 绑定端口(默认绑定所有 IP)。
5.2.2 方式 2:host 模式(共享宿主机网络)
如 2.2 节所述,host 模式容器共享宿主机 IP 和端口,外部直接访问宿主机端口即可(无需映射),适合高性能场景。
六、网络管理常用命令
| 需求 | 命令 | 说明 |
| 查看所有网络 | docker network ls | 列出 Docker 所有网络(默认 + 自定义) |
| 查看网络详情 | docker network inspect 网络名 | 查看网络的 IP 段、网关、关联容器等 |
| 创建自定义网络 | docker network create [参数] 网络名 | 支持 bridge、overlay 等类型(overlay 用于集群) |
| 容器绑定网络 | docker network connect 网络名 容器名 | 为已启动的容器添加新网络 |
| 容器解绑网络 | docker network disconnect 网络名 容器名 | 移除容器的某个网络 |
| 删除网络 | docker network rm 网络名 | 仅能删除无关联容器的网络 |
| 清理无用网络 | docker network prune | 删除所有未使用的网络(谨慎执行) |
七、总结
Docker 网络通过不同模式满足多样化通信需求,核心要点如下:
- 默认模式:none 安全隔离、host 高性能、bridge 通用灵活;
- 自定义网络:推荐用于生产环境,支持固定 IP、容器名通信,功能更完善;
- 通信原理:容器访问外部依赖 NAT 转发,外部访问容器依赖端口映射或 host 模式;
- 最佳实践:多容器协作优先用自定义 bridge 网络(支持容器名通信),高性能服务用 host 模式,安全敏感场景用 none 模式。
掌握 Docker 网络是实现容器化应用部署的关键,后续结合 Docker Compose/Kubernetes 可进一步实现多容器网络编排与管理。
更多推荐



所有评论(0)