1. 程式人生 > >Docker應用註冊dubbo ip 的問題

Docker應用註冊dubbo ip 的問題

端口 獲取 解決 echo 錯誤 由於 手動 動態 綁定

當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 的問題