Docker应用注册dubbo ip 的问题

Posted xiaoganghu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker应用注册dubbo ip 的问题相关的知识,希望对你有一定的参考价值。

当docker容器部署dubbo提供者和常规部署应用混合使用一套zookeeper时,将出现Docker容器中的dubbo提供者向zookeeper注册容器IP导致常规部署应用无法访问容器IP而失败。

解决方法:

通过以上方法一手动绑定IP,可将宿主机IP绑定到/etc/hosts文件中,并将dubbo服务端口通过宿主机映射出来,这样Docker中的提供者将向zookeeper注册宿主机的IP

方法分析:

启动容器时通过--add-host="hostname:host_ip"的参数向容器的/etc/hosts文件添加容器主机名和宿主机IP的映射关系;
容器启动后默认会自动向/etc/hosts文件的最后一行追加”hostname”与容器IP的映射关系,因此必须删掉该行;
容器的/etc/hosts文件是由宿主机挂载到Docker中,所以使用sed/awk等命令时候将导致设备或者资源忙的错误,因此通过以下方法绕过

cp /etc/hosts /tmp/hosts
sed -i ‘$d‘ /tmp/hosts
cat /tmp/hosts > /etc/hosts

优化方案:

由于在集群中容器都是通过集群动态创建的,宿主机的IP是不固定的,需要让容器自动获取宿主机的IP并添加到/etc/hosts文件中。

首先在每台宿主机上创建一个/etc/ip的文件,文件内容为宿主机的IP;
启动容器时通过-v /etc/ip:/etc/ip将/etc/ip文件挂载到容器中,这样容器通过/etc/ip即可获取其所对应的宿主机IP;
通过以下脚本将容器hostname与宿主机IP进行绑定。

#!/bin/bash
HOST_IP=`cat /etc/ip`
cp /etc/hosts /tmp/hosts
sed -i ‘$d‘ /tmp/hosts
echo "$HOST_IP  $HOSTNAME" >> /tmp/hosts
cat /tmp/hosts > /etc/hosts
docker exec container /ip.sh




以上是关于Docker应用注册dubbo ip 的问题的主要内容,如果未能解决你的问题,请参考以下文章

docker+dubbo的一些注意事项

分布式系列Dubbo源码下实现应用容器内部署

Java开发大型互联网-Dubbo源码下你不知道如何实现应用容器内部署

DUBBO多注册中心配置的应用

Dubbo服务注册到Zookeeper上的IP与本机IP不一致

解决SpringBoot在Docker运行注册IP不正确的问题