2015年3月17日

在Azure上透過Docker建立Tomcat+mySQL環境 (3)

前面兩篇文章設定的環境是在一台虛擬機器上啟動一個container;然而這樣一來,我們並沒有享受到docker帶給我們的好處。因為docker運行時並不需要透過hypervisor模擬硬體,理論上同樣規格的硬體可以支撐更多container執行才對。

因此,我們需要更進一步,在同一台機器上啟動多個container,然後透過Azure提供的HA機制讓這些不同主機上的container可以達到HA。

以下是我們想要建立的環境:透過一個haproxy,將Internet來的流量,平均分配給所有的container。在這個POC中,為了方便,我會設定Internet透過Cloud Service的8080來存取這個網站;當透過8080存取網站時,流量會先到達haproxy,透過haproxy分配給後面的container。

如果透過80存取網站,則還是會走前兩篇的方式存取網站。

image

在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

image

  • 接著,為了方便troubleshoot,修改rsyslog相關設定以便haproxy可以把log寫到syslog
    • vi /etc/rsyslog.conf
    • Unmark以下兩行

image

  • 建立或新增/etc/rsyslog.d/haproxy.conf
    • vi /etc/rsyslog.d/haproxy.conf
    • 新增以下這一行
      • local2.* /var/log/haproxy/haproxy.log

image

  • 重啟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

image

如此,由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。

image

打開瀏覽器;可以發現流量確實有分散到不同container上了。

image

沒有留言:

Blog Archive

About Me