Bootstrap

解决docker容器部署dubbo服务时,注册到注册中心的地址是docker容器内的地址

今天遇到一个问题,我们用docker容器部署springboot的应用程序,当我们跨机器调用服务时,会出现无法调用到服务。经过排查出现问题的原因如下:

1、Aservice使用docker部署,注册到zk上的ip地址为172.17.0.5(这是容器内部的ip地址)

2、Bservice从zk取到Aservice的地址为Aservice容器内的地址

3、当Aservice和Bservice不在同一个主机时,就出现无法互通

要解决上述的问题,主要就是将docker容器管理的应用注册到zk上的地址弄成宿主机的ip地址。经过查找资料,尝试了两种解决方案。

1、通过docker网络模式为主机模式(默认网桥)

docker run -d --name xxx –net “host” --restart=always xxx

这里可以不用配置端口映射,并且我们用docker ps也看不到该容器的绑定的端口

2、通过-e 设置一些dubbo注册到注册中心的ip地址,可通过下面参数指定

DUBBO_IP_TO_REGISTRY — 注册到注册中心的IP地址

DUBBO_PORT_TO_REGISTRY — 注册到注册中心的端口

DUBBO_IP_TO_BIND — 监听IP地址

DUBBO_PORT_TO_BIND — 监听端口

假设我们的宿主机的ip是29.36.100.95

那么在根据镜像创建容器的时候,我们可以通过-e设置DUBBO_IP_TO_REGISTRY的值,下面是我的测试环境的创建设置语句

docker run -d --name xxx -e DUBBO_IP_TO_REGISTRY=29.36.100.95 -p 10010:10010 xxx

配置成功后,可以通过dubbo控制台,或者直接读取zk的节点信息,可以看到注册到zk上的ip地址为宿主机ip地址

想了解docker四种网络模式可参考(https://blog.csdn.net/qq_43570369/article/details/91504306

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;