在 Docker 中,网络是容器通信的核心能力之一。无论是 Web 服务、数据库还是微服务架构,都离不开网络配置。
本文将系统讲解 Docker 网络的类型、原理、常用命令以及实战配置方法,帮助你彻底理解容器网络通信机制。
一、Docker 网络是什么?
Docker 网络本质是:
容器之间、容器与宿主机之间的通信桥梁
默认情况下,每个容器都有独立网络命名空间。
二、Docker 默认网络类型
1️⃣ bridge(默认桥接网络)
这是最常用的模式。
特点:
- 容器通过虚拟网桥通信
- 可以访问外网
- 容器之间需通过 IP 或名称通信
查看:
docker network ls
2️⃣ host(宿主机网络)
特点:
- 容器共享宿主机网络
- 无端口隔离
- 性能最好,但隔离性差
运行方式:
docker run --network host nginx
3️⃣ none(无网络)
特点:
- 完全断网
- 用于安全或测试
docker run --network none alpine
4️⃣ overlay(集群网络)
用于:
- Swarm
- 多主机通信
5️⃣ macvlan(高级网络)
特点:
- 容器直接拥有局域网 IP
- 类似真实物理设备
三、Docker 网络结构原理
Docker 网络核心组件:
- bridge(虚拟网桥)
- veth pair(虚拟网卡对)
- iptables(流量转发)
- namespace(网络隔离)
简化理解:
容器A ---- veth ---- bridge ---- veth ---- 容器B
四、常用 Docker 网络命令
1. 查看网络
docker network ls
2. 查看网络详情
docker network inspect bridge
3. 创建网络
docker network create my-net
4. 删除网络
docker network rm my-net
5. 容器加入网络
docker network connect my-net container_name
五、容器之间通信方式
1️⃣ 通过 IP 通信
ping 172.17.0.2
缺点:IP 会变化 ❌
2️⃣ 通过容器名通信(推荐)
Docker 内置 DNS:
ping mysql
3️⃣ 自定义网络(最佳实践)
docker network create app-net
六、实战:Web + MySQL 网络通信
1. 创建网络
docker network create app-net
2. 启动 MySQL
docker run -d \
--name mysql \
--network app-net \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
3. 启动 Web
docker run -d \
--name web \
--network app-net \
nginx
4. 测试通信
进入 web:
docker exec -it web bash
测试:
ping mysql
✔ 成功说明网络互通
七、Docker Compose 网络(推荐)
在 Docker Compose 中,网络是自动创建的。
示例:
version: "3.9"
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
特点:
- 自动创建 bridge 网络
- 服务名就是 DNS 名
- 无需手动配置 IP
八、端口映射 vs 网络通信
1. 端口映射(对外访问)
-p 8080:80
作用:
外部访问容器
2. 网络通信(内部访问)
http://mysql:3306
作用:
容器之间通信
九、高级网络配置
1. 固定 IP(自定义 bridge)
docker network create \
--subnet=172.18.0.0/16 \
my-net
2. 指定 IP 运行容器
docker run -d \
--net my-net \
--ip 172.18.0.10 nginx
3. 限制容器网络
--network none
十、常见网络问题排查
1. 容器无法 ping 通
检查:
docker network inspect my-net
2. DNS 不生效
原因:
- 不在同一 network
3. 端口无法访问
检查:
ss -tulnp
4. 外网无法访问容器
检查:
- 防火墙
- 端口映射
- security group(云服务器)
十一、生产环境建议
✔ 1. 使用自定义网络
docker network create app-net
✔ 2. 避免使用默认 bridge
默认网络不适合复杂系统
✔ 3. 使用服务名访问
db:3306
redis:6379
✔ 4. 配合 Docker Compose
自动网络管理最优解
十二、总结
Docker 网络的核心就是三点:
- bridge(默认通信)
- DNS(容器名解析)
- network(隔离与互通)
而 Docker Compose 则进一步简化了网络管理:
自动创建网络 + 自动 DNS + 服务互通