Docker 的网络配置是容器通信和外部交互的核心,而 docker run 命令中的网络相关参数、Docker 内置的网络模式,以及自定义网络配置,共同构成了 Docker 网络的完整体系。以下从 网络模式详解、关键网络参数、容器通信案例 三个维度展开说明:
一、Docker 核心网络模式(4 种基础模式)
Docker 内置了 4 种网络模式,通过 --network 参数指定(默认是 bridge 模式),每种模式对应不同的网络隔离和通信规则。
1.bridge模式(默认模式)
- 工作原理:容器连接到 Docker 内置的 bridge 网桥(默认名为 docker0),容器拥有独立 IP(如 172.17.0.x),通过 NAT 与宿主机网络交互。
- 通信方式:同一宿主机内的容器可通过 容器名 / IP 互相通信(需在同一自定义桥接网络中,默认 bridge 网络需手动配置)。容器与外部网络通信需通过宿主机端口映射(-p 参数)。
- 适用场景:单机环境下,多容器协同工作(如 Web 容器 + 数据库容器)。
- 案例:
启动两个容器在默认 bridge 网络(需手动指定网络,默认网络不支持容器名解析):
# 创建自定义桥接网络(比默认 bridge 更灵活,支持容器名解析)
docker network create my-bridge-net
# 启动容器并加入自定义桥接网络
docker run -it -d -p 8081:80 --name my-nginx-1 -v ./:/usr/share/nginx/html --network my-bridge-net nginx:latest
docker run -d -p 5000:5000 -v app-data:/app --network my-bridge-net --name flask-demo my-flask-app:v1
# 在my-nginx-1容器内 ping flask-demo 容器(通过容器名通信)
/ # ping flask-demo # 成功返回,因为自定义桥接网络支持 DNS 解析
2.host模式
- 工作原理:容器共享宿主机的网络命名空间(IP、端口、网卡等完全复用宿主机),容器没有独立 IP。
- 通信方式:容器内的服务直接使用宿主机的端口(无需端口映射)。外部访问宿主机 IP: 端口 即可访问容器服务。
- 适用场景:对网络性能要求极高(如高并发服务),或需要直接使用宿主机网络环境的场景。
- 案例:
启动 Nginx 容器,直接使用宿主机的 80 端口:
docker run -d -v ./:/usr/share/nginx/html --network host --name host-nginx nginx
测试:
- 此时访问宿主机的 http://宿主机IP 即可看到 Nginx 欢迎页(无需 -p 80:80 映射)。
- 注意:容器会占用宿主机端口,需避免端口冲突。
3.host模式 vsbridge模式对比
维度 | bridge 模式 | host 模式 |
网络隔离 | 容器有独立网络命名空间 | 共享宿主机网络命名空间 |
端口占用 | 需端口映射(-p) | 直接使用宿主机端口 |
安全性 | 隔离性好(默认无法访问宿主机) | 隔离性差(容器可直接访问宿主机网络) |
适用场景 | 多容器协同(单机) | 高性能服务、依赖宿主机网络环境 |
4.none模式
- 工作原理:容器拥有独立网络命名空间,但无任何网络配置(无 IP、无网卡),完全禁用网络。
- 通信方式:无法与任何网络(包括宿主机和其他容器)通信。
- 适用场景:无需网络的离线任务(如数据处理、日志分析)。
- 案例:
启动一个仅处理本地文件的容器:
docker run -it --rm --network none nginx
5.overlay模式(跨主机通信)
- 工作原理:基于 VXLAN 技术,在多个 Docker 主机(节点)之间创建虚拟网络,容器可跨主机通信(需依赖 Docker Swarm 或第三方编排工具)。
- 通信方式:跨主机的容器在同一 overlay 网络中,可通过容器名 / IP 直接通信。
- 适用场景:分布式集群(如微服务跨主机部署)。
- 案例(基于 Docker Swarm):
# 初始化 Swarm 集群(管理节点)
docker swarm init
# 创建 overlay 网络
docker network create -d overlay my-overlay-net
# 在管理节点启动容器(自动加入 overlay 网络)
docker service create --name web --network my-overlay-net --replicas 2 nginx
# 在其他节点(已加入 Swarm)查看容器,跨节点容器可互相通信
docker ps
二、容器网络通信关键操作(案例)
1. 同一网络内容器通信(自定义 bridge 网络)
场景:如前面<1.bridge模式(默认模式)> 已有案例
2. 容器与外部网络通信(端口映射)
场景:让宿主机外部(如同一局域网的其他设备)访问容器内的服务。
docker run -d -p 5000:5000 -v app-data:/app --network my-bridge-net --name flask-demo my-flask-app:v1
# 宿主机外部设备通过 "宿主机IP:5000" 访问(如 192.168.1.100:5000)
curl http://宿主机IP:5000 # 成功访问容器内的 Flask 服务
3. 容器与宿主机通信(host 模式)
场景:容器直接使用宿主机网络,无需端口映射,适合需要高性能网络的场景。如前面<2.host模式>案例
三、自定义网络配置(docker network命令)
除了内置网络,可通过 docker network 命令创建、管理自定义网络,实现更灵活的隔离和通信规则。
1. 常用docker network命令
命令 | 作用 |
docker network create <name> | 创建自定义网络(默认 bridge 类型) |
docker network ls | 列出所有网络 |
docker network inspect <name> | 查看网络详情(含关联的容器、IP 等) |
docker network connect <name> <container> | 将容器加入网络 |
docker network disconnect <name> <container> | 将容器从网络移除 |
docker network rm <name> | 删除网络(需先断开所有容器) |
2. 自定义网络高级配置(指定子网、网关)
场景:为容器分配固定网段的 IP(避免与宿主机网络冲突)。
# 创建自定义 bridge 网络,指定子网和网关
docker network create \
--driver bridge \
--subnet 192.168.100.0/24 \ # 子网
--gateway 192.168.100.1 \ # 网关
my-custom-net
# 启动容器时指定固定 IP(需在子网范围内)
docker run -d --name app \
--network my-custom-net \
--ip 192.168.100.10 \ # 固定 IP
nginx
四、总结
Docker 网络模式的选择需根据场景决定:
- 单机多容器通信:优先 自定义 bridge 网络(支持 DNS 解析,隔离性好)。
- 高性能 / 无端口冲突需求:host 模式(但需注意端口占用)。
- 无网络需求:none 模式。
- 跨主机集群:overlay 模式(依赖 Swarm 或 Kubernetes)。
通过合理配置网络,可实现容器间、容器与外部的安全、高效通信,是 Docker 部署的核心环节。