为什么我在 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 能够工作

posted @ 2026-02-07 07:30  CalvinMax  阅读(0)  评论(0)    收藏  举报