今天遇到一個問題,我們用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)