01 - Docker 网络模型
Docker 网络类型
Docker 提供了多种网络驱动,每种适用于不同场景:
┌─────────────────────────────────────────────────────────────┐
│ Docker Host │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ bridge (docker0) - 默认 │ │
│ │ 172.17.0.0/16 │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ App A │ │ App B │ │ App C │ │ │
│ │ │ .17.0.2 │ │ .17.0.3 │ │ .17.0.4 │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────┐ │
│ │ host 网络 │ │
│ │ 容器直接使用宿主机网络栈 │ │
│ │ 没有网络隔离 │ │
│ └───────────────────────────┘ │
│ │
│ ┌───────────────────────────┐ │
│ │ none 网络 │ │
│ │ 完全隔离,无网络连接 │ │
│ └───────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘四种主要网络模式
| 模式 | 说明 | 使用场景 |
|---|---|---|
| bridge | 默认模式,容器通过虚拟网桥通信 | 单机多容器通信 |
| host | 容器共享宿主机网络栈 | 需要最高网络性能 |
| none | 没有网络连接 | 安全隔离、离线处理 |
| overlay | 跨主机容器网络 | Docker Swarm / 多机部署 |
Bridge 网络详解
默认 bridge 网络
bash
# 查看所有网络
docker network ls
# 查看默认 bridge 网络详情
docker network inspect bridge
# 默认 bridge 的容器之间可以通过 IP 通信,但不能通过容器名通信
docker run -d --name c1 nginx:alpine
docker run -d --name c2 nginx:alpine
docker exec c1 ping -c 2 172.17.0.3 # ✓ 可以通过 IP
docker exec c1 ping -c 2 c2 # ✗ 不能通过容器名自定义 bridge 网络(推荐)
bash
# 创建自定义网络
docker network create my-network
# 在自定义网络中运行容器
docker run -d --name c1 --network my-network nginx:alpine
docker run -d --name c2 --network my-network nginx:alpine
# 自定义网络支持容器名 DNS 解析
docker exec c1 ping -c 2 c2 # ✓ 可以通过容器名!
# 清理
docker stop c1 c2 && docker rm c1 c2
docker network rm my-network自定义网络的优势
- 自动 DNS 解析:容器之间可以通过名称互相访问
- 更好的隔离:不同网络中的容器互相不可见
- 可配置:可以指定子网、网关等
端口映射深入
bash
# 映射到指定端口
docker run -d -p 8080:80 nginx
# 映射到随机端口
docker run -d -p 80 nginx
docker port <container_id> # 查看分配的端口
# 映射到指定 IP
docker run -d -p 127.0.0.1:8080:80 nginx
# 映射多个端口
docker run -d -p 8080:80 -p 8443:443 nginx
# 映射 UDP 端口
docker run -d -p 5353:53/udp dns-server实操练习
bash
# 创建一个隔离的应用网络
docker network create app-net
# 运行 Redis
docker run -d --name redis --network app-net redis:alpine
# 运行一个 Python 容器,验证可以通过名称访问 Redis
docker run --rm -it --network app-net python:3.11-slim bash
# 在容器内:
pip install redis
python -c "import redis; r = redis.Redis(host='redis'); r.set('key','hello'); print(r.get('key'))"
exit
# 清理
docker stop redis && docker rm redis
docker network rm app-net