Skip to content

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

最佳实践

  1. 不同安全域使用不同自定义网络(如 frontendbackend 隔离)。
  2. 数据库等内部服务不要 -p 暴露到公网,仅放内部网络。
  3. 微服务跨机部署用 overlay + Swarm 或直接使用 Kubernetes。
  4. 避免在 host 网络下运行不可信容器(共享网络命名空间)。