前面兩篇文章設定的環境是在一台虛擬機器上啟動一個container;然而這樣一來,我們並沒有享受到docker帶給我們的好處。因為docker運行時並不需要透過hypervisor模擬硬體,理論上同樣規格的硬體可以支撐更多container執行才對。
因此,我們需要更進一步,在同一台機器上啟動多個container,然後透過Azure提供的HA機制讓這些不同主機上的container可以達到HA。
以下是我們想要建立的環境:透過一個haproxy,將Internet來的流量,平均分配給所有的container。在這個POC中,為了方便,我會設定Internet透過Cloud Service的8080來存取這個網站;當透過8080存取網站時,流量會先到達haproxy,透過haproxy分配給後面的container。
如果透過80存取網站,則還是會走前兩篇的方式存取網站。
在dockerweb1這台虛擬機器上,我會建立新的tomcat container;並將host 81 port對應到這個container的8080 port (因為host 80已經在前篇文章中對應給原本的container了,因此無法再使用host 80 port)
安裝HAProxy
- 首先建立一台新的虛擬機器(haproxy),將他加入同一個虛擬網路的Subnet-Web
- ssh到這台機器中安裝haproxy
- apt-get install haproxy
- 安裝完成後,建立或修改/etc/haproxy.cfg
- 其中可以看到我設定了三台web server:10.0.0.4:80、10.0.0.4:81與10.0.0.5:80
- 這裡面10.0.0.4是dockerweb1這台虛擬機器的IP,10.0.0.5是dockerweb2的IP;而80/81是該主機上的port,透過docker port mapping對應給container的8080
- 接著,為了方便troubleshoot,修改rsyslog相關設定以便haproxy可以把log寫到syslog
- vi /etc/rsyslog.conf
- Unmark以下兩行
- 建立或新增/etc/rsyslog.d/haproxy.conf
- vi /etc/rsyslog.d/haproxy.conf
- 新增以下這一行
- local2.* /var/log/haproxy/haproxy.log
- 重啟rsyslog
- service rsyslog restart
啟動Web Container
- ssh到dockerweb1主機
- 啟動新的container,這裡改用host 81 port對應到container 8080 port
- docker run -p 81:8080 -d -v /home/azureuser/webapps/:/tmp/apache-tomcat-7.0.59/webapps michilab /bin/sh /tmp/apache-tomcat-7.0.59/bin/catalina.sh run
- 在host透過sudo docker ps確認container執行狀態以及port mapping
如此,由Internet來的流量,經過Azure LBSet,到haproxy,haproxy根據haproxy.cfg中的設定,將流量導向我們指定的10.0.0.4:80與10.0.0.4:81;在10.0.0.4這台主機上,我們啟動兩個container,一個將80對應到其8080;另一個將81對應到其8080。
打開瀏覽器;可以發現流量確實有分散到不同container上了。
沒有留言:
張貼留言