一、首先,先区分四个对象,它们分别有自己的网络
1、云服务器上,应用服务容器网络(app,nginx,mysql,redis等)app.net
2、云服务器上,模型服务容器网络(ai服务) 模型网络 ai.net
3、云服务器上:宿主机网络(服务器本机) 服务器本机网络 host.net
4、本机:本地网络 local.net
nginx和app在同一个网络内,nginx映射端口出来,app通过nginx反向代理暴露出来
注意,app没有映射端口出来,本机,以及服务器上宿主机是都访问不到的
二、本机调用生产上服务的一整条链路:
1、本机通过云服务器映射端口的nginx(80:默认开放,容器部署映射出来端口)访问到应用app服务(app.net网络)
2、app要完成接口逻辑,需要访问云服务器上模型容器的服务(ai.net网络),由于两个容器网络不通,所以只能通过模型容器映射容器内端口到宿主机环境(模型容器内网络没有nginx组件),这样app才能访问到模型服务,即相当于应用容器内app服务访问了宿主机上的服务一样
3、故此完成了一次完整的服务链路调用过程
还有两点需要注意:
1)云上应用docker-compose启的,应用服务容器之间网络(app.net)是互通的,直接容器名称互相访问,例如:app替代ip就行了(不能使用localhost,只有在同一个容器才能用)
2)从app服务访问模型容器服务,它们是通过宿主机完成通信的,此时不能再写localhost,要用宿主机内网ip才行
应用服务容器、模型服务容器、宿主机, 它们三个之间不能使用localhost,因为它们是三个相对独立隔离的环境,它们都有各自的localhost网络,并且都是互相独立的
三、服务调用链路图:
以上是我个人的理解,有哪里不合理的,欢迎帮我指出来