理解容器网络模型,掌握五种网络模式
| 模式 | 适用场景 | 隔离性 | DNS 解析 | 端口映射 |
|---|---|---|---|---|
| bridge | 同主机多容器通信(默认) | 容器间隔离 | 自定义网络有 | 需要 -p 映射 |
| host | 高性能网络,直接用宿主机网络 | 无隔离 | 无(直接用宿主机) | 不需要 |
| none | 完全隔离,不需要网络 | 完全隔离 | 无 | 无 |
| macvlan | 容器需要独立 IP(物理网络可见) | 物理网络级隔离 | 依赖外部 DNS | 不需要 |
| ipvlan | 类似 macvlan 但共享 MAC 地址 | 较 macvlan 弱 | 依赖外部 DNS | 不需要 |
# 创建不同类型的网络
docker network create mynet # bridge(默认)
docker network create -d macvlan \ # macvlan
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 macnet
自定义 bridge 网络内置 DNS,容器可通过容器名互访。默认 bridge 网络不支持 DNS。
# 创建自定义网络
docker network create appnet
# 启动容器加入网络
docker run -d --name api --network appnet myapi
docker run -d --name web --network appnet nginx:alpine
# web 容器内可以直接访问 api
docker exec web curl http://api:8080
http://db:5432、http://redis:6379。--link 是 Docker 早期容器互联方式,已被自定义网络完全取代。
| 维度 | --link(已废弃) | 自定义网络(推荐) |
|---|---|---|
| DNS | 修改 /etc/hosts(静态) | 内置 DNS(动态) |
| 双向通信 | 不支持 | 支持 |
| 多容器 | 需逐个 link | 加入网络即可 |
| 重启后 | IP 变化可能失效 | DNS 自动更新 |
# ❌ 旧方式(已废弃)
docker run --name app --link db:database myapp
# ✅ 新方式(推荐)
docker network create mynet
docker run --name db --network mynet mysql:8.0
docker run --name app --network mynet myapp
# 仅本机可访问
docker run -p 127.0.0.1:5432:5432 postgres:16-alpine
# 所有接口可访问(默认)
docker run -p 5432:5432 postgres:16-alpine
# Compose 中指定绑定地址
ports:
- "127.0.0.1:5432:5432" # 仅本机
- "3000:3000" # 公开
127.0.0.1,避免暴露到公网。用 docker ps --format "table {{.Names}}\t{{.Ports}}" 检查端口绑定。一个容器可以同时加入多个网络,实现灵活的网络拓扑。
# 创建前后端网络
docker network create frontend
docker network create backend
# API 容器加入两个网络
docker run -d --name api --network backend myapi
docker network connect frontend api
# Nginx 只在前端网络
docker run -d --name nginx --network frontend nginx:alpine
# DB 只在后端网络
docker run -d --name db --network backend mysql:8.0
# nginx → api (frontend网) → db (backend网)
# db 无法被 nginx 直接访问(网络隔离)
networks 关键字为服务指定多个网络。