最近在作marathon-lb的虛擬域名配置,發現官方的文檔中都是這樣寫的HAPROXY_0_VHOST,以前從官方文檔知道如何綁定多個域名(多個域名用逗號隔開,marathon-lb會自動發現註冊到haproxy的配置中),可是對其中的{n},爲啥都用0表示,耿耿於懷~shell
以前根據項目要求,訪問同一域名須要根據目錄轉發到不一樣的容器上,繼而配置了HAPROXY_0_PATH,該項和HAPROXY_0_VHOST項的值以笛卡爾積結果過濾請求的URL。centos
"labels": { "HAPROXY_GROUP": "dsp", "HAPROXY_0_PATH": "-i /dsp-admin /dsp-api", "HAPROXY_0_VHOST": "test.dsp.com.cn,test.api.dsp.com" }
訪問http://test.dsp.com.cn/dsp-admin(本機已配置host,IP指向marathon-lb容器實例所在機器的IP)能夠返回對應結果。
此處有幾點細節要注意:api
本身的PC要配置hosts,IP指向marathon-lb容器實例所在機器的IP瀏覽器
marathon-lb應該固定主機啓動,這樣不至於容器亂飄,本身的PC要不停修改hoststomcat
這裏建議以Host模式啓動容器,由於在centos7下啓用的是firewall-cmd防火牆,marathon網關不支持開放bridge模式隨機分配的端口,若是仍是iptables則無此問題,自由選擇app
若是選擇Host模式,須要配置marathon分配的端口號範圍,而後開啓firewall-cmd相同端口區間,再去容器的啓動腳本里替換tomcat的啓動端口號,server.xml中的8080,8005,8009,8443,還有catalina.sh文件中的8000端口,不然在同一臺主機啓動多個相同應用會報端口衝突(緣由請自行研究Host模式細節),Host模式端口配置tcp
"portDefinitions": [centos7
{ "port": 0, "protocol": "tcp", "labels": {} }, { "port": 0, "protocol": "tcp", "labels": {} }, { "port": 0, "protocol": "tcp", "labels": {} }, { "port": 0, "protocol": "tcp", "labels": {} }, { "port": 0, "protocol": "tcp", "labels": {} }
]spa
啓動(shell)腳本對應配置code
echo "PORT0:${PORT0}"
if [ x"${PORT0}" != x ]; then
sed -i "s;8080;${PORT0};" /app/tomcat/conf/server.xml
echo "tomcat http port is replaced by : ${PORT0}"
fi
echo "PORT1:${PORT1}"
if [ x"${PORT1}" != x ]; then
sed -i "s;8000;${PORT1};" /app/tomcat/bin/catalina.sh
echo "tomcat catalina 8000 port is replaced by : ${PORT1}"
fi
echo "PORT2:${PORT2}"
if [ x"${PORT2}" != x ]; then
sed -i "s;8005;${PORT2};" /app/tomcat/conf/server.xml
echo "tomcat server 8005 port is replaced by : ${PORT2}"
fi
echo "PORT3:${PORT3}"
if [ x"${PORT3}" != x ]; then
sed -i "s;8009;${PORT3};" /app/tomcat/conf/server.xml
echo "tomcat server 8009 port is replaced by : ${PORT3}"
fi
echo "PORT4:${PORT4}"
if [ x"${PORT4}" != x ]; then
sed -i "s;8443;${PORT4};" /app/tomcat/conf/server.xml
echo "tomcat server 8443 port is replaced by : ${PORT4}"
fi
經過PORT0等環境變量獲取容器在主機上分配的端口號,即完成Host模式啓動腳本配置。
HAPROXY_{n}_VHOST這裏的n爲啥寫0呢?
在labels中,包含0的Key與servicePort定義對應 ,從0開始。若是你有多個servicePort定義,你會遍歷它們做爲0,1,2,依此類推。
Host模式下HAPROXY_0_VHOST表示我要將portDefinitions定義的第一個port號映射到haproxy的80端口上,這裏我把haproxy的配置文件貼上來
haproxy的配置細節可自行百度。
總結:n表示你想將本身的這個容器的第幾個端口暴露在marathon-lb:80端上。
感受總結的不太好,舉個栗子吧:
假設portDefinitions定義的端口,第一個分到的主機port是20001,則對應容器暴露的也是20001,第二個分到的是20002,對應容器暴露的端口也是20002,(由於咱們把tomcat的8080換成了20001,上面腳本的PORT0),若是再啓動第二個tomcat的話,把第二個tomcat的8080也換成20002,而後配置
"HAPROXY_0_VHOST": "a.com"
"HAPROXY_1_VHOST": "b.com"
訪問a.com,則會打開tomcat1的首頁,訪問b.com則會打開tomcat2的首頁,其實就是告訴瀏覽器經過域名訪問都是通過marathon-lb的haproxy的80端口而後根據VHOST的域名配置轉發到後臺容器暴露的端口上。