學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 操作系統(tǒng) > Linux教程 > 如何在Linux系統(tǒng)下使用Docker及Weave搭建Nginx的反向代理

如何在Linux系統(tǒng)下使用Docker及Weave搭建Nginx的反向代理

時(shí)間: 曉斌668 分享

如何在Linux系統(tǒng)下使用Docker及Weave搭建Nginx的反向代理

  Hi, 今天學(xué)習(xí)啦小編將會(huì)帶領(lǐng)大家學(xué)習(xí)如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/負(fù)載均衡服務(wù)器。

Weave 可以創(chuàng)建一個(gè)虛擬網(wǎng)絡(luò)將 Docker 容器彼此連接在一起,支持跨主機(jī)部署及自動(dòng)發(fā)現(xiàn)。它可以讓我們更加專注于應(yīng)用的開發(fā),而不是基礎(chǔ)架構(gòu)。
Weave 提供了一個(gè)如此棒的環(huán)境,仿佛它的所有容器都屬于同個(gè)網(wǎng)絡(luò),不需要端口/映射/連接等的配置。容器中的應(yīng)用提供的服務(wù)在 weave 網(wǎng)絡(luò)中可以輕易地被外部世界訪問(wèn),不論你的容器運(yùn)行在哪里。
在這個(gè)教程里我們將會(huì)使用 weave 快速并且簡(jiǎn)單地將 nginx web 服務(wù)器部署為一個(gè)負(fù)載均衡器,反向代理一個(gè)運(yùn)行在 Amazon Web Services 里面多個(gè)節(jié)點(diǎn)上的 docker 容器中的簡(jiǎn)單 php 應(yīng)用。這里我們將會(huì)介紹 WeaveDNS,它提供一個(gè)不需要改變代碼就可以讓容器利用主機(jī)名找到的簡(jiǎn)單方式,并且能夠讓其他容器通過(guò)主機(jī)名連接彼此。

  而且在這篇教程里,我們還會(huì)將使用 nginx 來(lái)將負(fù)載均衡分配到一個(gè)運(yùn)行 Apache 的容器集合。最簡(jiǎn)單輕松的方法就是使用 Weave 來(lái)把運(yùn)行在 ubuntu 上的 docker 容器中的 nginx 配置成負(fù)載均衡服務(wù)器。

  Docker之weave工具

  weave是什么呢?weave創(chuàng)建了一個(gè)虛擬網(wǎng)絡(luò),用來(lái)連接部署在多臺(tái)機(jī)器上的docker容器。

  下面看看weave的應(yīng)用場(chǎng)景:

  應(yīng)用在使用該網(wǎng)絡(luò)的時(shí)候就像所有的容器都在同一個(gè)交換機(jī)網(wǎng)絡(luò)下一樣,不需要配置端口映射、連接等等,容器中的應(yīng)用提供的服務(wù)在weaver網(wǎng)絡(luò)中可以被外部世界訪問(wèn),不論你的容器運(yùn)行在哪里。同樣的,已經(jīng)存在的系統(tǒng)應(yīng)用也可以暴露給容器中的應(yīng)用來(lái)調(diào)用,而不用擔(dān)心內(nèi)部應(yīng)用運(yùn)行的位置。

  weave可以穿透防火墻,流量是被加密的,允許主機(jī)連接通過(guò)一個(gè)不被信任的網(wǎng)絡(luò),使用weave你可以方便的部署多個(gè)容器在不同的地方運(yùn)行

  假如你有一個(gè)docker應(yīng)用運(yùn)行在兩臺(tái)不同的主機(jī)HOST1和HOST2上面,也就是我們要在這兩臺(tái)主機(jī)上各部署一個(gè)相同類型的docker應(yīng)用。

  在HOST1上面:?jiǎn)?dòng)weave

  代碼如下:

  #這一步先啟動(dòng)weave路由,需要在每一臺(tái)HOST上都啟動(dòng)

  weave launch

  #啟動(dòng)一個(gè)容器,在命令行設(shè)置了一個(gè)ip,weave run調(diào)用docker run -d,因此我們可以使用這種辦法啟動(dòng)一個(gè)容器,同理存在weave start命令,它是調(diào)用docker start命令啟動(dòng)已經(jīng)存在的容器,如果我們?cè)谠揌OST1上有多個(gè)容器要部署,則繼續(xù)執(zhí)行第二行的命令即可,只要保證容器設(shè)置的ip沒有沖突即可,同一個(gè)網(wǎng)段的ip可以到處使用

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

  在HOST2上面:?jiǎn)?dòng)weave

  代碼如下:

  #這一步有點(diǎn)不一樣,我們?cè)贖OST2上告訴weave他有一個(gè)同行在HOST1上,可以指定ip或者主機(jī)名,還可以指定端口。如果在HOST1和HOST2直接有防火墻,要確保tcp/udp的6783端口被打開

  weave launch $HOST1

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

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

  我們也可以告訴HOST1去連接HOST2,或者兩者都告訴他們,這是沒有任何問(wèn)題的,weave會(huì)自動(dòng)的連接,在他們的服務(wù)啟動(dòng)后,我們也可以告訴weave連接多個(gè)同行,你可以提供多個(gè)ip地址,用空格分開即可。

  在HOST1上面:

  代碼如下:

  docker attach $ssh

  在HOST2上面:

  代碼如下:

  docker attach $ssh

  然后兩者進(jìn)行互ping,會(huì)發(fā)現(xiàn)網(wǎng)絡(luò)是通的

  下面來(lái)看一下具體的部署過(guò)程

  1. 搭建 AWS 實(shí)例

  首先,我們需要搭建 Amzaon Web Service 實(shí)例,這樣才能在 ubuntu 下用 weave 跑 docker 容器。我們將會(huì)使用AWS 命令行 來(lái)搭建和配置兩個(gè) AWS EC2 實(shí)例。在這里,我們使用最小的可用實(shí)例,t1.micro。我們需要一個(gè)有效的Amazon Web Services 賬戶使用 AWS 命令行界面來(lái)搭建和配置。我們先在 AWS 命令行界面下使用下面的命令將 github 上的 weave 倉(cāng)庫(kù)克隆下來(lái)。

  代碼如下:

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

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

  在克隆完倉(cāng)庫(kù)之后,我們執(zhí)行下面的腳本,這個(gè)腳本將會(huì)部署兩個(gè) t1.micro 實(shí)例,每個(gè)實(shí)例中都是 ubuntu 作為操作系統(tǒng)并用 weave 跑著 docker 容器。

  復(fù)制代碼

  代碼如下:

  $ sudo ./demo-aws-setup.sh

  在這里,我們將會(huì)在以后用到這些實(shí)例的 IP 地址。這些地址儲(chǔ)存在一個(gè) weavedemo.env 文件中,這個(gè)文件創(chuàng)建于執(zhí)行 demo-aws-setup.sh 腳本期間。為了獲取這些 IP 地址,我們需要執(zhí)行下面的命令,命令輸出類似下面的信息。

  代碼如下:

  $ 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)

  請(qǐng)注意這些不是固定的 IP 地址,AWS 會(huì)為我們的實(shí)例動(dòng)態(tài)地分配 IP 地址。

  我們?cè)?bash 下執(zhí)行下面的命令使環(huán)境變量生效。

  代碼如下:

  . ./weavedemo.env

  2. 啟動(dòng) Weave 和 WeaveDNS

  在安裝完實(shí)例之后,我們將會(huì)在每臺(tái)主機(jī)上啟動(dòng) weave 以及 weavedns。Weave 以及 weavedns 使得我們能夠輕易地將容器部署到一個(gè)全新的基礎(chǔ)架構(gòu)以及配置中, 不需要改變代碼,也不需要去理解像 Ambassador 容器以及 Link 機(jī)制之類的概念。下面是在第一臺(tái)主機(jī)上啟動(dòng) weave 以及 weavedns 的命令。

  代碼如下:

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

  $ sudo weave launch

  $ sudo weave launch-dns 10.2.1.1/24

  下一步,我也準(zhǔn)備在第二臺(tái)主機(jī)上啟動(dòng) 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. 啟動(dòng)應(yīng)用容器

  現(xiàn)在,我們準(zhǔn)備跨兩臺(tái)主機(jī)啟動(dòng)六個(gè)容器,這兩臺(tái)主機(jī)都用 Apache2 Web 服務(wù)實(shí)例跑著簡(jiǎn)單的 php 網(wǎng)站。為了在第一個(gè) Apache2 Web 服務(wù)器實(shí)例跑三個(gè)容器, 我們將會(huì)使用下面的命令。

  復(fù)制代碼

  代碼如下:

  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

  在那之后,我們將會(huì)在第二個(gè)實(shí)例上啟動(dòng)另外三個(gè)容器,請(qǐng)使用下面的命令。

  代碼如下:

  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 選項(xiàng)告訴容器使用 weavedns 來(lái)解析主機(jī)名,-h x.weave.local 則使得 weavedns 能夠解析該主機(jī)。

  4. 啟動(dòng) Nginx 容器

  在應(yīng)用容器如預(yù)期的運(yùn)行后,我們將會(huì)啟動(dòng) nginx 容器,它將會(huì)在六個(gè)應(yīng)用容器服務(wù)之間輪詢并提供反向代理或者負(fù)載均衡。 為了啟動(dòng) nginx 容器,請(qǐng)使用下面的命令。

  復(fù)制代碼

  代碼如下:

  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 上公開地暴露成為一個(gè) http 服務(wù)器。

  5. 測(cè)試負(fù)載均衡服務(wù)器

  為了測(cè)試我們的負(fù)載均衡服務(wù)器是否可以工作,我們執(zhí)行一段可以發(fā)送 http 請(qǐng)求給 nginx 容器的腳本。我們將會(huì)發(fā)送6個(gè)請(qǐng)求,這樣我們就能看到 nginx 在一次的輪詢中服務(wù)于每臺(tái) web 服務(wù)器之間。

  代碼如下:

  $ ./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",

  "hostname" : "ws3.weave.local",

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

  }

  {

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

  "hostname" : "ws4.weave.local",

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

  }

  {

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

  "hostname" : "ws5.weave.local",

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

  }

  {

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

  "hostname" : "ws6.weave.local",

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

  }

  結(jié)束語(yǔ):學(xué)習(xí)啦小編最終成功地將 nginx 配置成一個(gè)反向代理/負(fù)載均衡服務(wù)器,通過(guò)使用 weave 以及運(yùn)行在 AWS(Amazon Web Service)EC2 里面的 ubuntu 服務(wù)器中的 docker。從上面的步驟輸出可以清楚的看到我們已經(jīng)成功地配置了 nginx。我們可以看到請(qǐng)求在一次輪詢中被發(fā)送到6個(gè)應(yīng)用容器,這些容器在 Apache2 Web 服務(wù)器中跑著 PHP 應(yīng)用。在這里,我們部署了一個(gè)容器化的 PHP 應(yīng)用,使用 nginx 橫跨多臺(tái)在 AWS EC2 上的主機(jī)而不需要改變代碼,利用 weavedns 使得每個(gè)容器連接在一起,只需要主機(jī)名就夠了,眼前的這些便捷, 都要?dú)w功于 weave 以及 weavedns。你們都學(xué)會(huì)了么……

358860