自定义 bridge 网络是什么
Docker 默认的 docker0 网络只保证 IP 互通,不支持按容器名解析,而且所有容器挤在同一个网段里没有隔离。自建 bridge 网络则提供内置 DNS 与网络隔离:同一网络内的容器用容器名即可互访,这是 Compose 单机多容器通信的基础,也是踩坑最多的地方——服务名能解析的前提是双方在同一个自定义网络里。
基本信息
| 创建 | docker network create mynet,默认驱动即 bridge |
|---|---|
| 内置 DNS | 同网络内容器名与别名自动解析 |
| 隔离行为 | 不同自定义网络默认互不可达,需 connect 打通 |
| 默认 bridge 缺陷 | docker0 上只能按 IP 互访,--link 已废弃 |
| 连接查看 | docker network inspect mynet 看已接入的容器列表 |
典型使用场景
- 应用与数据库互联:web 用服务名 db 连接数据库,不写死 IP
- 多项目隔离:两个项目各建网络,同名服务互不干扰
- 调试联合:把排查用的临时容器接入业务网络,直接用服务名测试
- 替换机器内容器:重建容器后名字不变,上游无需改配置
- 限制访问面:数据库只接入应用网络,不暴露给其他容器
典型流程
典型流程
docker network create mynet # 创建自定义 bridge 网络
docker run -d --name db --network mynet mysql:8.0
docker run -d --name web --network mynet -e DB_HOST=db nginx:1.27
docker exec web getent hosts db # 在 web 内验证名字解析
# 容器重建后 IP 会变但名字不变,应用配置一律写服务名
docker network inspect mynet # 查看当前接入的容器与 IP故障现象对照
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
| 名称解析失败 | 容器不在同一网络 | 用 network connect 接入,或重建时加 --network |
| 能解析但连不上 | 服务未监听或端口写错 | 在容器内用 ss 与 curl 逐层验证 |
| 时通时断 | 网络子网与内网重叠 | 换一个不冲突的网段重建网络 |
| 重建后连接失败 | 上游配置写死了容器 IP | 改为使用服务名而非 IP |
| 跨网络互访失败 | 不同自定义网络默认隔离 | 显式 connect 打通或统一网络 |
容器重建后 IP 会变化、但容器名不变,因此应用配置一律写服务名。写死容器 IP 是重建后突然连不上的典型原因。
DNS 只解析同一自定义网络内的容器。跨网络调用会报名称解析失败,需要先把容器接入目标网络,而不是怀疑应用或数据库配置。