程序通过docker向zookeeper注册服务时,会将容器地址(内网地址)作为服务的通信地址。当我们的程序都在容器内相互通信时,可以凭借容器地址相互通信。但是外部程序想要直接通过宿主机取访问服务时,从zk上取到providers的地址,得到的是 容器ip + 端口,通常为:dubbo 172.24.0.3 21882XXXXXXServiceXXX,访问不到。特别是我们开发时需要连接一些测试环境的服务时,遇到这种问题总不能把服务在本地都启动一遍吧。
在创建容器时,给容器增加dubbo相关的特殊配置。以docker-compose为例。在environment下增加如下配置:
environment:
DUBBO_IP_TO_REGISTRY: 192.168.1.11 #宿主机IP
DUBBO_PORT_TO_REGISTRY: 31882 #宿主机端口
31882宿主机端口与程序内配置的dubbo端口别忘记映射,好多人容易忽略
ports:
- 8184:8080
- 31882:21882
添加完之后,重新构建一个容器,观察dubbo服务提供者的通信地址 就变成 dubbo 192.168.1.11 31882 XXXXXXServiceXXX。至此本地与容器内的dubbo服务就可以正常通信了。