Docker 容器网络详解:Bridge、Host 和 Overlay 模式
James Park | 2026-08-27T20:55:57 | DevOps
深入讲解 Docker 三种网络模式的原理与适用场景,通过实验演示容器间通信和跨主机网络配置。
# Docker 容器网络详解 ## 网络模式概览 ```bash # 查看 Docker 网络 docker network ls # NETWORK ID NAME DRIVER SCOPE # abc123 bridge bridge local # def456 host host local # ghi789 none null local ``` ## 一、Bridge 模式(默认) 每个容器有独立网络命名空间,通过虚拟网桥 docker0 通信。 ```bash # 创建自定义 Bridge 网络 docker network create --driver bridge --subnet 172.20.0.0/16 my-network # 容器加入自定义网络 docker run -d --name app --network my-network nginx docker run -d --name db --network my-network mysql:8 # 同一网络内的容器可以通过容器名互访 docker exec app ping db # PING db (172.20.0.3): 56 data bytes # 64 bytes from 172.20.0.3: time=0.089 ms ``` ### 容器 DNS 解析 ```bash # 自定义网络自动提供 DNS 解析 docker exec app nslookup db # Name: db # Address: 172.20.0.3 # 默认 bridge 网络不提供 DNS,需要用 --link(已过时) ``` ## 二、Host 模式 容器直接使用宿主机网络栈,没有网络隔离。 ```bash docker run -d --network host --name web nginx # 直接访问 http://宿主机IP:80 # 适用场景: # 1. 性能敏感(避免 NAT 开销) # 2. 需要监听大量端口 # 3. 网络监控工具 ``` ## 三、端口映射详解 ```bash # -p 宿主机端口:容器端口 docker run -p 8080:80 nginx # 映射到所有接口 docker run -p 127.0.0.1:8080:80 nginx # 仅本地访问 docker run -p 8080:80/udp nginx # UDP 端口 docker run -P nginx # 随机映射所有暴露端口 ``` ## 四、容器间通信实验 ```bash # 创建前后端网络 docker network create frontend docker network create backend # 数据库只在 backend 网络 docker run -d --name mysql --network backend mysql:8 # API 服务连接两个网络 docker run -d --name api --network backend my-api docker network connect frontend api # Nginx 只在 frontend 网络 docker run -d --name nginx --network frontend -p 80:80 nginx # 网络拓扑: # nginx (frontend) -> api (frontend + backend) -> mysql (backend) # nginx 无法直接访问 mysql(网络隔离) ``` ## 五、Overlay 网络(跨主机) ```bash # 初始化 Swarm(在管理节点) docker swarm init --advertise-addr 10.0.0.1 # 创建 Overlay 网络 docker network create -d overlay --attachable my-overlay # 跨主机的容器可以互相通信 docker service create --name web --network my-overlay --replicas 3 nginx ``` ## 六、网络排查命令 ```bash # 查看容器网络详情 docker inspect --format='{{json .NetworkSettings.Networks}}' container_name # 查看网络中的容器 docker network inspect my-network # 容器内抓包 docker exec container_name tcpdump -i eth0 -n port 80 # 查看端口映射 docker port container_name # 查看 iptables 规则(端口映射实现) sudo iptables -t nat -L -n | grep DNAT ``` ## 七、Docker Compose 网络 ```yaml # docker-compose.yml services: web: image: nginx networks: - frontend api: image: my-api networks: - frontend - backend db: image: mysql:8 networks: - backend networks: frontend: driver: bridge backend: driver: bridge internal: true # 禁止外部访问 ``` ## 网络模式对比 | 模式 | 隔离性 | 性能 | 适用场景 | |------|--------|------|----------| | Bridge | 好 | 中 | 大多数场景 | | Host | 无 | 最高 | 性能敏感 | | Overlay | 好 | 中 | 跨主机集群 | | None | 完全 | - | 安全隔离 |