最实用稳定的方案是创建可复用的外部L2网络(如my-app-net),使单体与微服务容器接入同一网络平面并基于容器名互访;需手动创建网络、显式引用、禁用默认bridge、设置container_name及aliases,并验证网络连通性与服务监听地址。

不能真正“共享网络栈”,但能通过复用外部自定义网络,让传统单体容器与新微服务容器处于同一逻辑网络平面,实现无缝通信——这是最实用、最稳定的做法。
先创建可复用的共享网络
单体应用和微服务必须接入同一个 L2 网络才能基于容器名互访。不能依赖默认 bridge,必须手动创建并显式引用:
- 运行
docker network create my-app-net创建独立桥接网络(推荐指定子网和网关,便于后续调试) - 该网络生命周期独立于 Compose 项目,可长期存在、跨项目复用
- 确保所有参与通信的容器(无论是否由 Compose 启动)都加入此网络
单体容器接入共享网络
传统单体若已用 docker run 启动,需重新运行并绑定网络;若正迁移中,可在 Compose 中声明:
- 在单体服务的
docker-compose.yml中添加:
networks:
default:
name: my-app-net
external: true - 禁用默认网络干扰:不声明其他 networks,也不设
network_mode: bridge - 为单体容器显式设置
container_name: monolith,方便微服务直接调用
微服务组件按需挂载并命名互通
每个微服务应作为独立 service 编排,通过别名或服务名暴露能力,避免全量暴露:
- 在微服务的
docker-compose.yml中同样引用my-app-net为 external 网络 - 使用
aliases控制可见性,例如日志服务只对单体可见:
services:
logger:
networks:
my-app-net:
aliases: [logger.internal] - 单体代码中访问
http://logger.internal:8080/ingest即可,无需改 Host 或配 DNS
验证连通性与规避常见断点
网络配置生效 ≠ 服务可用,需逐层确认:
- 执行
docker network inspect my-app-net,检查单体和各微服务容器是否都在Containers列表中 - 进入单体容器:
docker exec -it monolith sh,运行ping logger.internal和nslookup logger.internal - 确认微服务监听的是
0.0.0.0:端口而非127.0.0.1—— 容器内 localhost 不通其他容器 - 避免在单体侧用
ports暴露内部微服务端口,那会绕过网络直连,引入 NAT 和防火墙不确定性


















