Docker 网络模式
容器默认相互隔离,要互通或对外提供服务,必须借助网络。Docker 提供 bridge、host、container、none 四种网络模式,理解它们才能设计出正确的访问关系。
四种模式总览
docker run 用 --network 指定模式,不写时默认是 bridge:
| 模式 | 网络情况 | 适用场景 |
|---|---|---|
| bridge(默认) | 容器接入虚拟网桥,各有独立 IP,可互访 | 单机多容器互访、-p 端口映射对外 |
| host | 容器直接使用宿主机网络栈,没有独立 IP | 追求网络性能、不想做端口映射 |
| container | 与指定容器共享同一网络栈 | 抓包排查、伴生(sidecar)容器 |
| none | 关闭网络,仅保留回环接口 | 离线计算、高安全隔离 |
默认网络
安装 Docker 后自带三个默认网络,用 docker network ls 查看:
docker network ls
# 输出:NETWORK ID NAME DRIVER SCOPE
# ... bridge bridge local
# ... host host local
# ... none null local
默认 bridge:容器互访
不加 --network 的容器都挂在默认 bridge 上,彼此可用 IP 互通;容器 IP 用 docker inspect 查询:
docker run -d --name web1 nginx:alpine
docker run -d --name web2 nginx:alpine
docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' web1
# 输出:172.17.0.2
docker exec web2 ping -c 1 172.17.0.2 # web2 用 IP 访问 web1
# 输出:64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.2 ms
注意:默认 bridge 不支持用容器名做 DNS 解析。想用 web1 这样的名字互访,需要自定义网络(下一章),它能自动解析容器名。
host 模式:端口直通
--network host 下容器与宿主机共用网络栈,服务直接监听宿主机端口,-p 会被忽略:
docker run -d --network host --name web nginx:alpine
curl http://localhost:80 # 容器内 nginx 直接占用了宿主机的 80 端口
container 模式:共享网络栈
--network container:<容器名> 让新容器与目标容器共用同一份网络栈(IP 相同),彼此可用 localhost 访问:
docker run -d --name main nginx:alpine
docker run --rm --network container:main alpine:3.20 wget -qO- http://localhost
# 输出:<!DOCTYPE html> ... nginx 欢迎页(经由 main 的网络栈访问)
小结
四种模式一句话记忆:bridge 是默认虚拟网桥、配 -p 对外服务;host 直通宿主机网络性能最好;container 与指定容器共享网络栈;none 完全离线。要更灵活的名字互访与隔离,接着看自定义网络。