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