Docker 网络
目录
前言
1. Docker 网络模式
2. 默认 bridge 网络详解
(1)特点
(2)操作示例
3. host 网络模式
(1)特点
(2)操作示例
4. overlay 网络(跨主机通信)
(1)特点
(2)操作示例
5. macvlan 网络(物理网络集成)
(1)特点
(2)操作示例
6. 网络调试命令
7. 最佳实践
8. 常见问题
(1)容器无法访问外网?
(2)端口映射失效?
前言
Docker 提供了多种网络模式,用于管理容器之间、容器与宿主机以及外部网络的通信。不同的网络模式适用于不同的场景,如开发、测试、生产环境等。
1. Docker 网络模式
Docker 默认支持以下网络模式:
网络模式 | 描述 | 适用场景 |
---|---|---|
bridge | 默认模式,容器通过虚拟网桥(docker0 )通信,每个容器分配独立 IP | 单机多容器通信(默认推荐) |
host | 容器直接使用宿主机的网络栈,不隔离网络(性能最好,但安全性低) | 高性能应用(如负载均衡、网络监控) |
none | 禁用所有网络,容器仅能通过 localhost 访问 | 安全隔离环境(极少使用) |
overlay | 跨主机的容器网络(用于 Docker Swarm/Kubernetes) | 分布式集群(多主机通信) |
macvlan | 为容器分配 MAC 地址,使其在物理网络中像独立设备运行 | 传统网络设备迁移(如 IoT、NFV) |
2. 默认 bridge
网络详解
(1)特点
- Docker 默认创建
docker0
虚拟网桥(IP 通常为172.17.0.1/16
)。 - 每个容器分配独立 IP(如
172.17.0.2
)。 - 容器间默认互通(但不同主机的
bridge
网络不互通)。 - 端口映射(
-p 宿主机端口:容器端口
)使外部访问容器服务。
(2)操作示例
# 查看所有网络
docker network ls# 创建自定义 bridge 网络(推荐)
docker network create my-bridge --driver=bridge --subnet=192.168.100.0/24# 运行容器并指定网络
docker run -d --name web --network my-bridge nginx# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
3. host
网络模式
(1)特点
- 容器直接使用宿主机网络(无 NAT,性能最佳)。
- 端口直接绑定到宿主机(无需
-p
映射)。 - 缺点:端口冲突风险,安全性低。
(2)操作示例
# 使用 host 网络运行容器
docker run -d --name web --network host nginx# 访问服务(直接使用宿主机 IP)
curl http://localhost:80
4. overlay
网络(跨主机通信)
(1)特点
- 用于 Docker Swarm 或 Kubernetes,实现多主机容器通信。
- 基于 VXLAN 封装,支持加密(
--opt encrypted
)。
(2)操作示例
# 初始化 Swarm 集群
docker swarm init# 创建 overlay 网络
docker network create -d overlay my-overlay# 在 Swarm 中运行服务
docker service create --name web --network my-overlay nginx
5. macvlan
网络(物理网络集成)
(1)特点
- 容器直接接入物理网络,拥有独立 MAC 和 IP。
- 适用于需要直接暴露到局域网的场景(如 IoT 设备模拟)。
(2)操作示例
# 创建 macvlan 网络
docker network create -d macvlan \--subnet=192.168.1.0/24 \--gateway=192.168.1.1 \--ip-range=192.168.1.100/32 \-o parent=eth0 \my-macvlan# 运行容器
docker run -d --name iot-device --network my-macvlan alpine
6. 网络调试命令
命令 | 作用 |
---|---|
docker network ls | 列出所有网络 |
docker network inspect 网络名 | 查看网络详情(IP 段、容器列表等) |
docker exec -it 容器名 ping IP | 测试容器间通信 |
tcpdump -i docker0 | 抓包分析 bridge 网络流量 |
7. 最佳实践
- 生产环境推荐
- 使用自定义
bridge
网络(避免默认docker0
的 IP 冲突)。 - 限制容器间通信:
docker network create --internal my-net
。
- 使用自定义
- 跨主机通信
- 选择
overlay
网络(Swarm/K8s)或macvlan
(物理网络集成)。
- 选择
- 安全隔离
- 敏感服务使用
--network none
。 - 防火墙规则限制容器访问:
iptables -A DOCKER-USER -j DROP
。
- 敏感服务使用
8. 常见问题
(1)容器无法访问外网?
# 检查 DNS 配置
docker run --dns 8.8.8.8 alpine ping baidu.com# 检查宿主机 iptables
sudo iptables -L -n | grep DROP
(2)端口映射失效?
# 确认容器监听 0.0.0.0(而非 127.0.0.1)
docker exec nginx netstat -tuln | grep 80# 检查宿主机端口占用
netstat -tuln | grep 8080