
要用 Docker Bridge 网络实现多容器间平稳通信,关键不是用默认的 bridge 网络,而是创建并使用用户自定义桥接网络(User-defined Bridge Network)。它自带 DNS 解析、IP 隔离和稳定的服务名通信能力,是生产环境推荐的唯一可靠方式。
为什么默认 bridge 网络不推荐用于跨容器通信
默认的 bridge 网络(即 docker0)存在明显限制:
- 容器之间无法通过容器名直接解析,必须手动查 IP 或依赖已废弃的
--link - 不支持自定义子网、网关或 MTU,容易与宿主机或其他 Docker 网络冲突
- DNS 服务未启用,无法自动完成服务发现
- 端口映射和防火墙规则管理复杂,调试困难
创建用户自定义桥接网络
执行以下命令创建一个带明确子网和网关的自定义网络:
docker network create --driver bridge \ --subnet=172.20.0.0/16 \ --gateway=172.20.0.1 \ my-bridge-net
-
--driver bridge显式声明驱动,增强可读性和兼容性 -
--subnet推荐使用172.16.0.0/12范围内的私有网段,避开宿主机常用网段(如192.168.x.x或10.x.x.x) - 创建后可用
docker network ls查看,用docker network inspect my-bridge-net验证子网与网关配置
让多个容器加入同一网络
只有处于同一自定义桥接网络中的容器,才能通过服务名互通:
- 启动时指定网络:
docker run -d --name web --network my-bridge-net nginxdocker run -d --name db --network my-bridge-net postgres:15 - 运行中接入已有容器:
docker network connect my-bridge-net app-container - 容器启动后,
web可直接用ping db或curl http://db:5432(若协议支持)访问 - Docker 内置 DNS 自动将容器名解析为 IPv4 地址,无需改
/etc/hosts
验证通信是否真正生效
进入任一容器内部,分三步确认:
- DNS 解析:
nslookup db或getent hosts db—— 应返回172.20.x.x类似地址 - TCP 连通性:
nc -zv db 5432(PostgreSQL)或telnet db 6379(Redis) - 应用层访问:如在
web容器中执行psql -h db -U postgres,或用curl http://db:8080/health(若服务暴露)
若某步失败,优先检查容器是否确实在同一网络、目标服务是否监听 0.0.0.0 而非 127.0.0.1,以及端口是否正确开放。


















