Docker 网络配置与自定义网络实战 2026

💡 Docker 网络基础:Docker 提供了强大的网络功能,允许容器之间、容器与主机之间以及容器与外部网络之间进行通信。理解 Docker 网络是构建复杂容器化应用的关键。
本文将带你从 0 到 1 掌握:
- ✅ Docker 默认网络类型详解
- ✅ 自定义网络创建与配置
- ✅ 容器间通信方式
- ✅ 端口映射与网络访问
- ✅ 跨主机网络方案
- ✅ 网络故障排查技巧
一、Docker 网络基础
1.1 Docker 网络类型概述
Docker 支持多种网络驱动,每种驱动适用于不同的场景:
| 网络类型 | 驱动名称 | 用途 | 隔离性 | 跨主机 |
|---|---|---|---|---|
| Bridge | bridge | 单主机容器间通信 | 高 | ❌ |
| Host | host | 共享主机网络栈 | 无 | ❌ |
| None | none | 完全隔离 | 最高 | ❌ |
| Overlay | overlay | 跨主机容器通信 | 高 | ✅ |
| Macvlan | macvlan | 直接接入物理网络 | 中 | ✅ |
| IPvlan | ipvlan | 灵活的 L2/L3 网络 | 中 | ✅ |
1.2 查看网络信息
# 列出所有网络
docker network ls
# 查看网络详情
docker network inspect bridge
# 查看容器的网络配置
docker inspect <container-name> | grep -A 20 "Networks"
# 查看容器的 IP 地址
docker inspect <container-name> --format '{{ .NetworkSettings.IPAddress }}'1.3 Docker 网络架构
┌─────────────────────────────────────────────────────────────┐
│ Docker Host │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Container │ │ Container │ │ Container │ │
│ │ App1 │ │ App2 │ │ App3 │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └───────────────────┼───────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Bridge │ │
│ │ Network │ │
│ └────────┬────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Docker0 │ │
│ │ Virtual │ │
│ │ Bridge │ │
│ └────────┬────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Host Network │ │
│ │ (eth0/wlan0) │ │
│ └────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘二、默认网络详解
2.1 Bridge 网络
Bridge 是 Docker 的默认网络类型,容器启动时默认连接到 bridge 网络。
# 查看默认 bridge 网络
docker network inspect bridge
# 创建容器时指定网络
docker run -d --name my-app --network bridge nginx
# 容器间通过 IP 通信
docker exec -it container1 ping <container2-ip>Bridge 网络特点:
- 每个容器获得独立的 IP 地址
- 容器间可以通过 IP 互相访问
- 通过 NAT 方式访问外部网络
- 默认网络名称为
bridge
2.2 Host 网络
使用 host 网络时,容器共享主机的网络栈,不进行网络隔离。
# 使用 host 网络
docker run -d --name my-app --network host nginx
# 容器内监听的端口直接绑定到主机端口
curl http://localhost:80Host 网络特点:
- 容器共享主机 IP 和端口空间
- 性能最好(无需网络转换)
- 安全性较低(端口冲突风险)
- 适用于需要高性能网络的场景
2.3 None 网络
None 网络完全隔离容器,不提供网络连接。
# 使用 none 网络
docker run -d --name isolated-app --network none nginx
# 查看网络配置(只有 loopback)
docker inspect isolated-app | grep -A 10 "Networks"None 网络特点:
- 只有 loopback 接口
- 完全隔离,无法访问外部
- 适用于安全性要求极高的场景
- 需要手动配置网络
三、自定义网络创建
3.1 创建自定义 Bridge 网络
# 创建自定义 bridge 网络
docker network create --driver bridge my-network
# 创建带自定义子网的网络
docker network create \
--driver bridge \
--subnet 192.168.100.0/24 \
--gateway 192.168.100.1 \
my-custom-network
# 创建带 IPv6 支持的网络
docker network create \
--driver bridge \
--ipv6 \
--subnet fd00:1::/64 \
my-ipv6-network
# 删除网络
docker network rm my-network3.2 连接容器到自定义网络
# 创建容器时连接到自定义网络
docker run -d --name app1 --network my-network nginx
# 将运行中的容器连接到网络
docker network connect my-network existing-container
# 断开容器与网络的连接
docker network disconnect my-network existing-container
# 容器连接多个网络
docker run -d --name multi-net-app \
--network bridge \
--network my-network \
nginx3.3 网络别名与 DNS 解析
# 创建带别名的网络
docker network create --driver bridge my-network
# 容器加入网络时设置别名
docker run -d --name app1 --network my-network --network-alias web nginx
docker run -d --name app2 --network my-network nginx
# 在 app2 中通过别名访问 app1
docker exec -it app2 ping web
docker exec -it app2 curl http://web
# 自定义 DNS 配置
docker run -d \
--name app \
--network my-network \
--dns 8.8.8.8 \
--dns-search example.com \
nginx3.4 网络隔离与安全性
# 创建隔离网络(--internal 禁止外部访问)
docker network create \
--driver bridge \
--internal \
isolated-network
# 创建带防火墙规则的网络
docker network create \
--driver bridge \
--ip-range 172.20.0.0/24 \
--subnet 172.20.0.0/16 \
secure-network
# 查看网络的 IPAM 配置
docker network inspect secure-network | grep -A 10 "IPAM"四、端口映射
4.1 基本端口映射
# 将容器端口映射到主机端口
docker run -d --name web -p 8080:80 nginx
# 映射多个端口
docker run -d --name app \
-p 8080:80 \
-p 443:443 \
-p 3000:3000 \
nginx
# 指定绑定的主机地址
docker run -d --name web \
-p 127.0.0.1:8080:80 \
nginx
# 随机端口映射
docker run -d --name web -p 80 nginx
docker port web # 查看映射的端口4.2 端口映射类型
| 选项 | 语法 | 说明 |
|---|---|---|
-p host:container | -p 8080:80 | 绑定指定主机端口 |
-p ip:host:container | -p 127.0.0.1:8080:80 | 绑定指定 IP 和端口 |
-p container | -p 80 | 随机绑定主机端口 |
-P | -P | 映射所有暴露的端口 |
4.3 Docker Compose 端口映射
version: '3.8'
services:
web:
image: nginx
ports:
# 基本映射
- "8080:80"
# 指定绑定地址
- "127.0.0.1:8443:443"
# 随机端口
- "3000"
# UDP 端口
- "53:53/udp"
networks:
- my-network
networks:
my-network:
driver: bridge五、容器间通信
5.1 同一网络内通信
# 创建自定义网络
docker network create app-network
# 创建服务容器
docker run -d --name db --network app-network \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8.0
# 创建应用容器,通过容器名访问数据库
docker run -d --name web --network app-network \
-e DATABASE_HOST=db \
my-app
# 验证通信
docker exec -it web ping db
docker exec -it web nslookup db5.2 不同网络间通信
# 创建两个隔离网络
docker network create frontend
docker network create backend
# 创建数据库(后端网络)
docker run -d --name db --network backend mysql:8.0
# 创建应用(连接两个网络)
docker run -d --name app \
--network frontend \
--network backend \
my-app
# 创建前端(前端网络)
docker run -d --name web --network frontend nginx5.3 使用 Link(已废弃,不推荐)
# 旧版 link 方式(不推荐使用)
docker run -d --name db mysql:8.0
docker run -d --name app --link db:database my-app
# 推荐使用自定义网络替代
docker network create my-network
docker run -d --name db --network my-network mysql:8.0
docker run -d --name app --network my-network my-app六、跨主机网络
6.1 Overlay 网络
Overlay 网络用于 Docker Swarm 集群中的跨主机通信。
# 初始化 Swarm 集群
docker swarm init
# 创建 overlay 网络
docker network create \
--driver overlay \
--subnet 10.0.0.0/24 \
--attachable \
my-overlay-network
# 在不同节点上创建容器
docker service create \
--name web \
--network my-overlay-network \
--replicas 3 \
nginx6.2 Macvlan 网络
Macvlan 允许容器直接连接到物理网络,获得独立的 MAC 地址。
# 创建 macvlan 网络
docker network create \
--driver macvlan \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
--ip-range 192.168.1.100/28 \
--aux-address "host=192.168.1.10" \
-o parent=eth0 \
my-macvlan-network
# 创建使用 macvlan 的容器
docker run -d \
--name network-app \
--network my-macvlan-network \
--ip 192.168.1.101 \
nginx6.3 IPvlan 网络
IPvlan 提供更灵活的 L2/L3 网络配置。
# 创建 IPvlan L2 网络
docker network create \
--driver ipvlan \
--subnet 192.168.2.0/24 \
--gateway 192.168.2.1 \
-o parent=eth0 \
-o ipvlan_mode=l2 \
my-ipvlan-l2
# 创建 IPvlan L3 网络
docker network create \
--driver ipvlan \
--subnet 10.0.0.0/24 \
-o parent=eth0 \
-o ipvlan_mode=l3 \
my-ipvlan-l3七、网络配置最佳实践
7.1 网络规划原则
# 按环境隔离网络
docker network create --driver bridge dev-network
docker network create --driver bridge prod-network
docker network create --driver bridge staging-network
# 按服务类型隔离
docker network create --driver bridge frontend-network
docker network create --driver bridge backend-network
docker network create --driver bridge database-network7.2 Docker Compose 网络配置
version: '3.8'
services:
web:
image: nginx
networks:
- frontend
- backend
ports:
- "80:80"
api:
image: my-api
networks:
- backend
- database
db:
image: mysql:8.0
networks:
- database
volumes:
- db-data:/var/lib/mysql
networks:
frontend:
driver: bridge
name: frontend-network
backend:
driver: bridge
name: backend-network
database:
driver: bridge
name: database-network
internal: true # 禁止外部访问
volumes:
db-data:7.3 安全配置
# 创建内部网络(禁止外部访问)
docker network create \
--driver bridge \
--internal \
secure-backend
# 限制容器网络能力
docker run -d \
--name secure-app \
--network secure-backend \
--cap-drop NET_ADMIN \
--cap-drop NET_RAW \
my-app八、网络故障排查
8.1 常用排查命令
# 查看网络列表
docker network ls
# 查看网络详情
docker network inspect <network-name>
# 查看容器网络配置
docker inspect <container-name> | jq '.NetworkSettings'
# 测试容器间连通性
docker exec -it container1 ping container2
docker exec -it container1 curl http://container2:80
# 查看端口映射
docker port <container-name>
# 查看 Docker 网络日志
docker logs <container-name> 2>&1 | grep -i network
# 检查 DNS 解析
docker exec -it container1 nslookup google.com
docker exec -it container1 cat /etc/resolv.conf8.2 常见问题与解决方案
问题 1:容器无法访问外部网络
# 检查容器的 DNS 配置
docker exec -it container cat /etc/resolv.conf
# 手动指定 DNS
docker run -d \
--name app \
--dns 8.8.8.8 \
--dns 1.1.1.1 \
nginx问题 2:容器间无法通信
# 确保容器在同一网络
docker inspect container1 | grep Networks
docker inspect container2 | grep Networks
# 将容器连接到同一网络
docker network connect my-network container1
docker network connect my-network container2问题 3:端口映射不生效
# 检查端口是否被占用
netstat -tlnp | grep 8080
# 检查容器是否正常运行
docker ps -a
# 检查端口映射配置
docker inspect container | grep -A 10 "Ports"问题 4:网络冲突
# 检查现有网络配置
docker network inspect bridge | grep Subnet
# 创建自定义网络时指定不同子网
docker network create \
--driver bridge \
--subnet 192.168.200.0/24 \
my-network8.3 使用 tcpdump 抓包
# 在容器内安装 tcpdump
docker exec -it container apt-get update && apt-get install -y tcpdump
# 捕获网络流量
docker exec -it container tcpdump -i eth0 -w /tmp/capture.pcap
# 分析抓包文件
docker cp container:/tmp/capture.pcap .
tcpdump -r capture.pcap九、网络性能优化
9.1 选择合适的网络驱动
| 场景 | 推荐驱动 | 原因 |
|---|---|---|
| 单主机多容器 | Bridge | 隔离性好,性能适中 |
| 高性能需求 | Host | 零网络开销 |
| 跨主机通信 | Overlay | Swarm 原生支持 |
| 物理网络接入 | Macvlan | 直接访问物理网络 |
9.2 调整 MTU 大小
# 查看当前 MTU
ip link show docker0
# 创建网络时指定 MTU
docker network create \
--driver bridge \
--mtu 1450 \
optimized-network
# 修改 Docker 默认 MTU(需要重启)
echo '{
"mtu": 1450
}' > /etc/docker/daemon.json
systemctl restart docker9.3 禁用不必要的网络功能
# 禁用 IPv6(如果不需要)
echo '{
"ipv6": false
}' > /etc/docker/daemon.json
# 使用 --no-dns 禁用 DNS(特殊场景)
docker run -d \
--name app \
--network none \
--no-dns \
my-app结语
Docker 网络是容器化应用的核心基础设施,正确配置网络对于应用的安全性、性能和可扩展性至关重要。通过本文的学习,你已经掌握了:
- 网络类型:Bridge、Host、None、Overlay、Macvlan、IPvlan
- 自定义网络:创建、配置、隔离
- 容器通信:同一网络、跨网络、DNS 解析
- 端口映射:基本映射、高级配置
- 跨主机网络:Overlay、Macvlan、IPvlan
- 故障排查:常用命令、常见问题解决方案
推荐阅读:
🚀 提示: 在生产环境中,建议使用自定义网络进行服务隔离,避免使用默认的 bridge 网络。同时,根据实际需求选择合适的网络驱动,平衡性能和安全性。
延伸阅读
免责声明
本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。