主题
Docker 网络
Docker 网络决定了容器之间、容器与宿主机/外部之间的连通方式。理解网络模型是排错和架构设计的基础。
网络驱动(Driver)
| 驱动 | 说明 | 适用场景 |
|---|---|---|
bridge | 默认驱动,NAT 桥接 | 单机多容器通信 |
host | 直接使用宿主机网络栈 | 追求极致性能、端口敏感 |
none | 无网络 | 离线计算/安全隔离 |
overlay | 跨主机网络 | Swarm / 多机通信 |
macvlan | 给容器分配 MAC,像物理机 | 容器需直接暴露到物理网络 |
查看与创建:
bash
docker network ls
docker network create --driver bridge mynet
docker network inspect mynet默认 bridge 与自定义 bridge
默认 bridge 网络下,容器只能通过 IP 互访,且无法用容器名解析。推荐为应用创建自定义 bridge 网络,容器间可用服务名/容器名直接 DNS 解析:
bash
docker network create app-net
docker run -d --name db --network app-net postgres
docker run -d --name web --network app-net -p 8080:80 myapp
# web 容器内可直接 ping db端口映射
将容器端口发布到宿主机:
bash
# 宿主机随机端口 -> 容器 80
docker run -d -P nginx
# 指定映射
docker run -d -p 8080:80 nginx
# 仅监听本机回环
docker run -d -p 127.0.0.1:8080:80 nginx
# 指定协议
docker run -d -p 53:53/udp查看映射:
bash
docker port <容器名>
docker ps # PORTS 列host 网络
容器直接共享宿主机网络,无 NAT 开销,但端口不能与宿主机冲突:
bash
docker run -d --network host nginx
# 此时访问宿主机 80 即访问容器overlay 网络(跨主机)
Swarm 集群中创建 overlay 网络,实现跨节点容器通信(详见 Docker Swarm):
bash
docker network create --driver overlay --attachable app-overlay容器间通信实战
bash
# 1. 创建网络
docker network create backend
# 2. 启动两个容器接入同一网络
docker run -d --name redis --network backend redis:7
docker run -d --name api --network backend -p 3000:3000 myapi
# 3. 在 api 中通过主机名 redis 访问
# 应用配置 REDIS_HOST=redis网络排错
bash
# 查看容器 IP 与网络信息
docker inspect -f '{{ .NetworkSettings.IPAddress }}' <容器名>
# 进入容器测试连通性
docker exec -it <容器名> ping <另一容器名>
docker exec -it <容器名> nslookup <另一容器名>
# 查看宿主机 iptables NAT 规则(bridge 模式端口映射靠它)
sudo iptables -t nat -L -n | grep docker
# 清理无用网络
docker network prune最佳实践
- 不同安全域使用不同自定义网络(如
frontend与backend隔离)。 - 数据库等内部服务不要
-p暴露到公网,仅放内部网络。 - 微服务跨机部署用 overlay + Swarm 或直接使用 Kubernetes。
- 避免在
host网络下运行不可信容器(共享网络命名空间)。