Docker 网络模式深度解析
Docker 网络看着简单,实际上有几种模式,用错了会踩坑。这篇讲清楚。
网络模式
| 模式 | 用途 |
|------|------|
| bridge(默认) | 单机容器互联 |
| host | 跳过 Docker 网络层 |
| overlay | 多机 Docker Swarm |
| none | 无网络 |
bridge(最常用)
默认网络,容器分配独立 IP:
docker network ls
NETWORK ID NAME DRIVER
abc123 bridge bridge
def456 host host
ghi789 none none
容器间通过 IP 通信:
docker run -d --name web nginx
docker run -d --name api nginx
web 访问 api: curl http://api:80
自定义 bridge
比默认的好在哪:
- DNS 自动解析(容器名=域名)
- 网络隔离(不同 bridge 不通)
docker network create mynet
docker run -d --network mynet --name web nginx
docker run -d --network mynet --name api nginx
web 访问 api 不用 IP,直接 curl api
host 模式
容器直接用宿主机网络:
docker run --network host nginx
优点:性能最好(少一层 NAT)。
缺点:端口直接占宿主机,容易冲突。
适合:性能敏感、不需要隔离的服务。
port mapping(最常用方式)
docker run -p 8080:80 nginx
宿主机 8080 → 容器 80
格式:宿主机端口:容器端口
多端口
docker run -p 8080:80 -p 8443:443 nginx
指定 IP
docker run -p 127.0.0.1:8080:80 nginx
只有本机能访问
跨主机通信
默认情况下,不同宿主机的容器不通。
方案一:Overlay 网络(Swarm)
Docker Swarm 模式:
docker swarm init
docker network create -d overlay myoverlay
方案二:Macvlan
给容器分配宿主机同网段 IP:
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 macnet
docker run --network macnet --ip 192.168.1.100 nginx
容器直接有独立 IP,像真机一样。
我的用法
内部通信(bridge)
services:
halo:
networks:
- app
mysql:
networks:
- app
networks:
app:
driver: bridge
对外服务(port mapping)
services:
openresty:
ports:
- "80:80"
- "443:443"
敏感服务(不暴露)
services:
mysql:
# 不写 ports,只在内部网络
networks:
- app
踩坑记录
坑 1:容器间不通
不同 network 的容器不通。加上 --network 或放到同一个 network。
坑 2:端口冲突
两个容器抢同一个端口。改映射:
docker run -p 8081:80 # 换一个
坑 3:DNS 不解析
默认 bridge 没有内置 DNS。用自定义 bridge:
docker network create mynet
容器名自动解析
总结
- bridge:默认,单机互联
- host:高性能,无隔离
- overlay:多机 Swarm
- macvlan:容器有独立 IP
- port mapping:对外暴露服务
记住原则:对内用 bridge,对外用 port mapping。
Nginx/OpenResty Docker网络模式深度解析
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法