萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> 在Linux系統下使用Docker以及Weave搭建Nginx反向代理

在Linux系統下使用Docker以及Weave搭建Nginx反向代理

   Hi, 今天我們將會學習如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/負載均衡服務器。Weave 可以創建一個虛擬網絡將 Docker 容器彼此連接在一起,支持跨主機部署及自動發現。它可以讓我們更加專注於應用的開發,而不是基礎架構。Weave 提供了一個如此棒的環境,仿佛它的所有容器都屬於同個網絡,不需要端口/映射/連接等的配置。容器中的應用提供的服務在 weave 網絡中可以輕易地被外部世界訪問,不論你的容器運行在哪裡。在這個教程裡我們將會使用 weave 快速並且簡單地將 nginx web 服務器部署為一個負載均衡器,反向代理一個運行在 Amazon Web Services 裡面多個節點上的 docker 容器中的簡單 php 應用。這裡我們將會介紹 WeaveDNS,它提供一個不需要改變代碼就可以讓容器利用主機名找到的簡單方式,並且能夠讓其他容器通過主機名連接彼此。

  在這篇教程裡,我們將使用 nginx 來將負載均衡分配到一個運行 Apache 的容器集合。最簡單輕松的方法就是使用 Weave 來把運行在 ubuntu 上的 docker 容器中的 nginx 配置成負載均衡服務器。

  Docker之weave工具

  weave是什麼呢?weave創建了一個虛擬網絡,用來連接部署在多台機器上的docker容器。

  下面看看weave的應用場景:

  應用在使用該網絡的時候就像所有的容器都在同一個交換機網絡下一樣,不需要配置端口映射、連接等等,容器中的應用提供的服務在weaver網絡中可以被外部世界訪問,不論你的容器運行在哪裡。同樣的,已經存在的系統應用也可以暴露給容器中的應用來調用,而不用擔心內部應用運行的位置。

  weave可以穿透防火牆,流量是被加密的,允許主機連接通過一個不被信任的網絡,使用weave你可以方便的部署多個容器在不同的地方運行

  假如你有一個docker應用運行在兩台不同的主機HOST1和HOST2上面,也就是我們要在這兩台主機上各部署一個相同類型的docker應用。

  在HOST1上面:啟動weave

  代碼如下:

  #這一步先啟動weave路由,需要在每一台HOST上都啟動

  weave launch

  #啟動一個容器,在命令行設置了一個ip,weave run調用docker run -d,因此我們可以使用這種辦法啟動一個容器,同理存在weave start命令,它是調用docker start命令啟動已經存在的容器,如果我們在該HOST1上有多個容器要部署,則繼續執行第二行的命令即可,只要保證容器設置的ip沒有沖突即可,同一個網段的ip可以到處使用

  ssh=$(weave run 10.1.1.1/24 -t -i ubuntu)

  在HOST2上面:啟動weave

  代碼如下:

  #這一步有點不一樣,我們在HOST2上告訴weave他有一個同行在HOST1上,可以指定ip或者主機名,還可以指定端口。如果在HOST1和HOST2直接有防火牆,要確保tcp/udp的6783端口被打開

  weave launch $HOST1

  #和第一步中不同的地方在於,配置的IP不一樣

  ssh=$(weave run 10.1.1.2/24 -t -i ubuntu)

  我們也可以告訴HOST1去連接HOST2,或者兩者都告訴他們,這是沒有任何問題的,weave會自動的連接,在他們的服務啟動後,我們也可以告訴weave連接多個同行,你可以提供多個ip地址,用空格分開即可。

  在HOST1上面:

  代碼如下:

  docker attach $ssh

  在HOST2上面:

  代碼如下:

  docker attach $ssh

  然後兩者進行互ping,會發現網絡是通的

  下面來看一下具體的部署過程

  1. 搭建 AWS 實例

  首先,我們需要搭建 Amzaon Web Service 實例,這樣才能在 ubuntu 下用 weave 跑 docker 容器。我們將會使用AWS 命令行 來搭建和配置兩個 AWS EC2 實例。在這裡,我們使用最小的可用實例,t1.micro。我們需要一個有效的Amazon Web Services 賬戶使用 AWS 命令行界面來搭建和配置。我們先在 AWS 命令行界面下使用下面的命令將 github 上的 weave 倉庫克隆下來。

  代碼如下:

  $ git clone https://github.com/weaveworks/guides

  $ cd weave-gs/aws-nginx-ubuntu-simple

  在克隆完倉庫之後,我們執行下面的腳本,這個腳本將會部署兩個 t1.micro 實例,每個實例中都是 ubuntu 作為操作系統並用 weave 跑著 docker 容器。

  復制代碼

  代碼如下:

  $ sudo ./demo-aws-setup.sh

  在這裡,我們將會在以後用到這些實例的 IP 地址。這些地址儲存在一個 weavedemo.env 文件中,這個文件創建於執行 demo-aws-setup.sh 腳本期間。為了獲取這些 IP 地址,我們需要執行下面的命令,命令輸出類似下面的信息。

  代碼如下:

  $ cat weavedemo.env

  export WEAVE_AWS_DEMO_HOST1=52.26.175.175

  export WEAVE_AWS_DEMO_HOST2=52.26.83.141

  export WEAVE_AWS_DEMO_HOSTCOUNT=2

  export WEAVE_AWS_DEMO_HOSTS=(52.26.175.175 52.26.83.141)

  請注意這些不是固定的 IP 地址,AWS 會為我們的實例動態地分配 IP 地址。

  我們在 bash 下執行下面的命令使環境變量生效。

  代碼如下:

  . ./weavedemo.env

  2. 啟動 Weave 和 WeaveDNS

  在安裝完實例之後,我們將會在每台主機上啟動 weave 以及 weavedns。Weave 以及 weavedns 使得我們能夠輕易地將容器部署到一個全新的基礎架構以及配置中, 不需要改變代碼,也不需要去理解像 Ambassador 容器以及 Link 機制之類的概念。下面是在第一台主機上啟動 weave 以及 weavedns 的命令。

  代碼如下:

  ssh -i weavedemo-key.pem ubuntu@$WEAVE_AWS_DEMO_HOST1

  $ sudo weave launch

  $ sudo weave launch-dns 10.2.1.1/24

  下一步,我也准備在第二台主機上啟動 weave 以及 weavedns。

  代碼如下:

  ssh -i weavedemo-key.pem ubuntu@$WEAVE_AWS_DEMO_HOST2

  $ sudo weave launch $WEAVE_AWS_DEMO_HOST1

  $ sudo weave launch-dns 10.2.1.2/24

  3. 啟動應用容器

  現在,我們准備跨兩台主機啟動六個容器,這兩台主機都用 Apache2 Web 服務實例跑著簡單的 php 網站。為了在第一個 Apache2 Web 服務器實例跑三個容器, 我們將會使用下面的命令。

  復制代碼

  代碼如下:

  ssh -i weavedemo-key.pem ubuntu@$WEAVE_AWS_DEMO_HOST1

  $ sudo weave run --with-dns 10.3.1.1/24 -h ws1.weave.local fintanr/weave-gs-nginx-apache

  $ sudo weave run --with-dns 10.3.1.2/24 -h ws2.weave.local fintanr/weave-gs-nginx-apache

  $ sudo weave run --with-dns 10.3.1.3/24 -h ws3.weave.local fintanr/weave-gs-nginx-apache

  在那之後,我們將會在第二個實例上啟動另外三個容器,請使用下面的命令。

  代碼如下:

  ssh -i weavedemo-key.pem ubuntu@$WEAVE_AWS_DEMO_HOST2

  $ sudo weave run --with-dns 10.3.1.4/24 -h ws4.weave.local fintanr/weave-gs-nginx-apache

  $ sudo weave run --with-dns 10.3.1.5/24 -h ws5.weave.local fintanr/weave-gs-nginx-apache

  $ sudo weave run --with-dns 10.3.1.6/24 -h ws6.weave.local fintanr/weave-gs-nginx-apache

  注意: 在這裡,--with-dns 選項告訴容器使用 weavedns 來解析主機名,-h x.weave.local 則使得 weavedns 能夠解析該主機。

  4. 啟動 Nginx 容器

  在應用容器如預期的運行後,我們將會啟動 nginx 容器,它將會在六個應用容器服務之間輪詢並提供反向代理或者負載均衡。 為了啟動 nginx 容器,請使用下面的命令。

  復制代碼

  代碼如下:

  ssh -i weavedemo-key.pem ubuntu@$WEAVE_AWS_DEMO_HOST1

  $ sudo weave run --with-dns 10.3.1.7/24 -ti -h nginx.weave.local -d -p 80:80 fintanr/weave-gs-nginx-simple

  因此,我們的 nginx 容器在 $WEAVEAWSDEMO_HOST1 上公開地暴露成為一個 http 服務器。

  5. 測試負載均衡服務器

  為了測試我們的負載均衡服務器是否可以工作,我們執行一段可以發送 http 請求給 nginx 容器的腳本。我們將會發送6個請求,這樣我們就能看到 nginx 在一次的輪詢中服務於每台 web 服務器之間。

  代碼如下:

  $ ./access-aws-hosts.sh

  {

  "message" : "Hello Weave - nginx example",

  "hostname" : "ws1.weave.local",

  "date" : "2015-06-26 12:24:23"

  }

  {

  "message" : "Hello Weave - nginx example",

  "hostname" : "ws2.weave.local",

  "date" : "2015-06-26 12:24:23"

  }

  {

  "message" : "Hello Weave - nginx example",

copyright © 萬盛學電腦網 all rights reserved