目录
[1. Docker 网络模式](#1. Docker 网络模式)
[2. 默认 bridge 网络详解](#2. 默认 bridge 网络详解)
[3. host 网络模式](#3. host 网络模式)
[4. overlay 网络(跨主机通信)](#4. overlay 网络(跨主机通信))
[5. macvlan 网络(物理网络集成)](#5. macvlan 网络(物理网络集成))
[6. 网络调试命令](#6. 网络调试命令)
[7. 最佳实践](#7. 最佳实践)
[8. 常见问题](#8. 常见问题)
前言
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)操作示例
java
# 查看所有网络
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)操作示例
java
# 使用 host 网络运行容器
docker run -d --name web --network host nginx
# 访问服务(直接使用宿主机 IP)
curl http://localhost:80
4. overlay
网络(跨主机通信)
(1)特点
- 用于 Docker Swarm 或 Kubernetes,实现多主机容器通信。
- 基于 VXLAN 封装,支持加密(
--opt encrypted
)。
(2)操作示例
java
# 初始化 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)操作示例
java
# 创建 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)容器无法访问外网?
java
# 检查 DNS 配置
docker run --dns 8.8.8.8 alpine ping baidu.com
# 检查宿主机 iptables
sudo iptables -L -n | grep DROP
(2)端口映射失效?
java
# 确认容器监听 0.0.0.0(而非 127.0.0.1)
docker exec nginx netstat -tuln | grep 80
# 检查宿主机端口占用
netstat -tuln | grep 8080