为什么我在 docker-compose 里可以直接用服务名访问,但是我自己手动 docker run 两个容器却 ping 不通名字?
“这是因为 docker-compose 默认会自动创建一个自定义网络(通常叫 项目名_default),而自定义网络是支持 DNS 服务发现(Service Discovery)的。
相比之下,手动执行 docker run 如果不指定网络,默认使用的是 Default Bridge。出于向后兼容(Legacy)的原因,Default Bridge 不支持 DNS 自动解析,只能通过 IP 或过时的 --link 方式通信。
所以最佳实践是:永远不要在生产环境使用默认的 bridge 网络,总是创建一个自定义网络。”
总结对比图
| 特性 | 默认 Bridge (docker0) |
自定义 Bridge (docker network create) |
|---|---|---|
| 容器间通讯 | 只能靠 IP (不稳定) 或 --link (已废弃) |
支持 DNS 解析 (通过容器名) |
| 隔离性 | 差 (所有未指定网络的容器都在这) | 好 (不同网络之间默认隔离) |
| 热拔插 | 不支持 (容器运行时不能改变网络配置) | 支持 (docker network connect/disconnect) |
| 结论 | 不要用 (除非只是想简单测试一下) | 生产环境标准做法 |
强调 “创建一个专用网络” ,这不仅仅是为了隔离,更是为了让 DNS 能够工作。

浙公网安备 33010602011771号