一、Docker网络概述
Docker容器网络是云原生架构的基础:
网络模型:
- Bridge(桥接模式)
- Host(主机模式)
- Overlay(覆盖网络)
- Macvlan
- None
二、Bridge网络
1. 原理
┌─────────────┐ ┌─────────────┐
│ Container │ │ Container │
│ nginx:80 │ │ mysql:3306 │
└──────┬──────┘ └──────┬──────┘
│ │
│ 172.17.0.2 │ 172.17.0.3
│ │
┌──────┴──────────────────┴──────┐
│ docker0 bridge │
│ 172.17.0.1 │
└──────────────┬────────────────┘
│
┌──────┴──────┐
│ Host NIC │
│ 192.168.1.100│
└─────────────┘
2. 使用
bash
# 创建网络
docker network create my-bridge
# 运行容器指定网络
docker run -d --name web --network my-bridge nginx
# 查看网络
docker network inspect my-bridge
# 容器间通信
docker exec -it web ping mysql
3. 端口映射
bash
# 映射端口
docker run -d -p 8080:80 nginx
# 随机端口
docker run -d -P nginx
# 指定IP和端口
docker run -d -p 127.0.0.1:8080:80 nginx
三、Host网络
1. 原理
容器直接使用主机网络栈:
bash
# 使用host网络
docker run -d --network host nginx
2. 适用场景
- 性能敏感场景
- 需要使用主机端口
- 网络调试
四、Overlay网络
1. 原理
跨主机容器通信:
┌─────────────────┐ ┌─────────────────┐
│ Host A │ │ Host B │
│ ┌───────────┐ │ │ ┌───────────┐ │
│ │ Container │ │ │ │ Container │ │
│ │172.18.0.2 │ │ │ │172.18.0.3 │ │
│ └─────┬─────┘ │ │ └─────┬─────┘ │
│ │ │ │ │ │
│ ┌─────┴─────┐ │ │ ┌─────┴─────┐ │
│ │ overlay │ │◄────┼─►│ overlay │ │
│ └───────────┘ │ │ └───────────┘ │
└─────────────────┘ └─────────────────┘
2. 创建Overlay网络
bash
# 初始化Swarm
docker swarm init
# 创建overlay网络
docker network create -d overlay my-overlay
# 运行服务
docker service create --network my-overlay nginx
五、Macvlan网络
1. 原理
容器直接获取物理网络MAC地址:
bash
# 创建macvlan网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my-macvlan
# 运行容器
docker run -d --network my-macvlan nginx
2. 适用场景
- 需直接暴露容器IP
- 旧应用迁移
- 网络隔离
六、网络隔离
1. 网络隔离
bash
# 创建隔离网络
docker network create --internal backend
# 只有内部网络的容器
docker run -d --network backend mysql
2. DNS管理
yaml
# docker-compose.yml
services:
web:
image: nginx
networks:
- frontend
db:
image: mysql
networks:
- backend
networks:
frontend:
backend:
七、常用命令
bash
# 列出网络
docker network ls
# 查看网络详情
docker network inspect bridge
# 删除未使用的网络
docker network prune
# 连接容器到网络
docker network connect my-network container
# 断开容器网络
docker network disconnect my-network container
八、总结
Docker网络模型选择:
- Bridge:默认模式,适合单主机
- Host:高性能,直接使用主机网络
- Overlay:跨主机通信,Swarm/K8s
- Macvlan:需要独立IP
最佳实践:
- 生产环境使用自定义网络
- 合理规划网络段
- 做好网络隔离
3. 网络别名
bash
# Docker Compose网络
version: '3'
services:
web:
image: nginx
networks:
- frontend
- backend
db:
image: mysql
networks:
- backend
networks:
frontend:
backend:
internal: true # 完全隔离
九、Docker Compose网络
1. 网络配置
yaml
# docker-compose.yml
version: '3.8'
services:
app:
build: .
networks:
- app-network
db:
image: mysql
networks:
- app-network
networks:
app-network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
2. 外部网络
yaml
# 连接外部网络
networks:
existing-network:
external: true
十、总结
Docker网络模型选择要点:
- Bridge:默认模式,适合单主机多容器
- Host:高性能,直接使用主机网络
- Overlay:跨主机通信,适用于Swarm/K8s
- Macvlan:需要为容器分配独立IP
最佳实践:
- 生产环境使用自定义网络
- 合理规划网络段,避免冲突
- 做好网络隔离,敏感服务使用internal网络
- 使用Docker Compose统一管理网络配置
个人观点,仅供参考