把AspDotNetCoreMvc程序運行在Docker上-part4:實現負載均衡

   在上一part《把AspDotNetCoreMvc程序運行在Docker上-part3:使用獨立的存儲容器》,咱們利用MySql容器和Volume實現了真正意義上的數據存儲。整個結構很是簡單,就是一個web容器和一個數據庫容器,是一個簡單的應用。現在都流行支持高併發,集羣什麼的,最起碼要有多個web服務器,因而一般要用到負載均衡的技術,好比HAproxy,Nginx等等。那麼這一部分,咱們接着用Docker技術實現負載均衡,其實說嚴格仍是用的老技術,只不過包裝到了Docker容器中而已。html

 

自定義網絡配置node

docker內置了默認的網絡配置,默認的網絡配置是自動建立好的,可用於容器之間的網絡訪問。在上一part中的咱們就用到了這個默認的網絡配置,裏面的MySql容器就是經過默認網絡配置訪問的。mysql

經過如下命令能夠查看docker默認建立的網絡配置web

docker network lssql

NETWORK ID          NAME                DRIVER              SCOPE
13d5e19c447e        bridge              bridge              local
fb4ce1a7bfcf        host                host                local
ee50b1dc443b        none                null                local
docker

在建立了MySql容器以後,系統分配的網絡是bridge,咱們能夠經過如下命令查看bridge被哪一個容器使用數據庫

"Containers": {
             "d4e5cf975ad5e3ff11620c02f9b626fa4d0042faab83fa9d0ea86801d2cce452": {
                 "Name": "mysql",
                 "EndpointID": "5fe1c90310938704323ba4cbb7c156a962ca07cd49845d12ea142dff40021212",
                 "MacAddress": "02:42:ac:11:00:02",
                 "IPv4Address": "172.17.0.2/16",
                 "IPv6Address": ""
             }
         },
centos

從Containers節點能看到當前在使用該網絡配置的容器以及分配的IP地址,經過這個IP就能訪問到該容器。瀏覽器

 

這麼看來默認網絡配置彷佛夠用,可是它有他的侷限性。首先這個IP是docker分配的,須要手動去查看用的是哪一個IP地址。另一個重要問題就是,若是有多個容器都使用了同一個網絡,無法根據功能進行區分和管理,尤爲是後續咱們要講到的負載均衡功能,用自定義的網絡配置更加靈活。服務器

 

建立自定義網絡配置

 

經過如下命令建立frontend和backend兩個自定義網絡,名字能夠改爲其餘。

docker network create frontend

docker network create backend

frontend將用於咱們的網站容器,backend將用於MySql容器。

查看已建立的網絡

docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
f18bd38d350f        backend             bridge              local
13d5e19c447e        bridge              bridge              local
1318f2d56587        frontend            bridge              local
fb4ce1a7bfcf        host                host                local
ee50b1dc443b        none                null                local

 

有了自定義網絡以後,就能夠將它分配給容器

爲了便於演示,首先經過以下命令刪除以前建立的容器

docker rm -f $(docker ps -aq)

 

建立MySql容器,並指定使用backend網絡

docker run -p 3306:3306 -d --name mysql -v productdata:/var/lib/mysql --network=backend -e MYSQL_ROOT_PASSWORD=password -e bind-address=0.0.0.0 mysql:8.0.0

相比上一part,這裏只是多了一個—network參數

 

使用自定義網絡的還有一個頗有用的功能就是,在docker內部能夠經過容器的名稱做爲網絡訪問地址,好比咱們這裏建立了MySql容器,容器名是mysql,那麼實際上在docker內部,mysql就能夠做爲host名稱,而後docker內部會將mysql解析爲其分配的IP地址。這樣的話,咱們在docker內部就能夠直接用容器名稱來配置網絡參數,好比數據庫的主機地址,接下來咱們建立站點容器將使用到。

 

建立MVC網站容器

仍是使用以前咱們定義的鏡像shenba/aspdotnetcoremvc

這裏咱們建立三個容器

docker create --name app1 -e DBHOST=mysql -e MESSAGE="1st Server" --network backend shenba/aspdotnetcoremvc

docker create --name app2 -e DBHOST=mysql -e MESSAGE="2nd Server" --network backend shenba/aspdotnetcoremvc

docker create --name app3 -e DBHOST=mysql -e MESSAGE="3rd Server" --network backend shenba/aspdotnetcoremvc

這裏的建立命令只是MESSAGE不一樣,這個MESSAGE是個環境變量,會做爲網站內容輸出,用於識別目前是在哪一個容器中。

這裏的network的參數指定方式跟建立MySql容器的不一樣,這裏只是指定須要鏈接這個網絡,這三個容器都須要鏈接backend網絡訪問mysql容器。

此外,這裏建立的時沒有指定宿主機的端口映射。

 

咱們須要進一步將這三個容器鏈接到frontend網絡,而後經過frontend網絡訪問這三個容器。

鏈接到frontend網絡

docker network connect frontend app1

docker network connect frontend app2

docker network connect frontend app3

 

啓動這三個MVC站點容器

docker start app1 app2 app3

 

 

使用HAProxy容器

啓動完三個MVC網站容器以後,還不能被宿主機訪問到,由於沒有公開外網訪問的IP和端口,因此它們只能被docker內部的網絡訪問到。這就是咱們一般使用負載均衡的場景,應用服務器都部署在內網,而後外部經過反向代理的方式訪問到內部的應用服務器。因此接下來咱們須要一個反向代理的服務器,在docker裏固然就是一個安裝了反向代理服務的容器。

 

咱們使用HAPoxy容器來實現負載均衡,首先在docker所在的服務器(或者說是宿主機,這裏用的是centos)建立一個haproxy.cfg配置文件

defaults
         timeout connect 5000
         timeout client  50000
         timeout server  50000

frontend localnodes
         bind *:80
         mode http
         default_backend mvc

backend mvc
         mode http
         balance roundrobin
         server mvc1 app1:80
         server mvc2 app2:80
         server mvc3 app3:80

簡單的說就是將負載均衡服務器的80端口公開,而且將這個端口的請求分配到三個不一樣的MVC站點中。

 

接下來在cfg文件所在的目錄執行以下命令

docker run -d --name loadbalancer --network frontend -v "$(pwd)/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg" -p 3000:80 haproxy:1.7.0

參數跟建立其餘容器同樣,提供了名稱(loadbalancer),網絡(frontend),端口映射(3000:80),基於鏡像(haproxy:1.7.0)

比較特別的是-v參數,這裏是將宿主機的haproxy.cfg映射到了容器裏的haproxy.cfg文件。

 

好了到此,實現負載均衡的全部配置已經完成,打開瀏覽器輸入http://192.168.115.136:3000,重複刷新屢次那麼會看到網站的內容標題會發生變化,好比截圖所示

image

 

目前的結構圖以下

loadbalancer

相關文章
相關標籤/搜索