當前位置:
首頁 > 知識 > Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群

Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群

現在上網已經成為每個人必備的技能,打開瀏覽器,輸入網址,回車,簡單的幾步就能瀏覽到漂亮的網頁,那從請求發出到返回漂亮的頁面是怎麼做到的呢,我將從公司中一般的分層架構角度考慮搭建一個簡易集群來實現。目標是做到在瀏覽中輸入網址,打開網頁,而且每一層還具有高可用,只要一層中有一台主機是存活的,整個服務都將可用。

環境

  • Centos 7
  • Docker
  • 架構圖

Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群

打開今日頭條,查看更多圖片

Docker

安裝docker

最開始我是在MacOs系統上安裝docker(下載地址),但是macOS無法直接訪問docker容器的IP(官網上也有說明,有知道的朋友麻煩告知),最終在Centos7系統安裝docker,我安裝的是CE版本(下載及安裝說明地址).

安裝docker-compose

  • 使用curl下載
  • 將下載的文件許可權修改為可執行許可權
  • 將docker-compose移入/usr/bin目錄,以便在終端直接執行

具體參考官方安裝文檔

編寫 dockerfile

Docker下載完成之後,編寫dockerfile文件,下載centos7鏡像,此處要注意,由於以後我們要使用systemctl,所以需要特殊處理,如下:

FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i ==
systemd-tmpfiles-setup.service ] || rm -f $i; done);
rm -f /lib/systemd/system/multi-user.target.wants/*;
rm -f /etc/systemd/system/*.wants/*;
rm -f /lib/systemd/system/local-fs.target.wants/*;
rm -f /lib/systemd/system/sockets.target.wants/*udev*;
rm -f /lib/systemd/system/sockets.target.wants/*initctl*;
rm -f /lib/systemd/system/basic.target.wants/*;
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

具體情況請參考官方文檔說明

DNS

我計劃安裝兩台DNS伺服器,一台Master,一台Slave,Master配置IP與域名的正向與反向對應關係,Slave進行同步。

編寫docker-compose.yml

假定上面下載的centos image的名稱為centos,標籤為latest

version: "3"
services:
dns_master:
image: centos:latest
container_name: dns_master
hostname: dns_master
privileged: true
dns: 192.168.254.10
networks:
br0:
ipv4_address: 192.168.254.10
dns_slave:
image: centos:latest
container_name: dns_slave
hostname: dns_slave
privileged: true
dns:
- 192.168.254.10
- 192.168.254.11
networks:
br0:
ipv4_address: 192.168.254.11
networks:
br0:
driver: host
ipam:
driver: default
config:
-
subnet: 192.168.254.0/24

從docker-compose.yml文件可知我選擇了bridge橋接網路模式,並為dns master和dns slave分別分配了ip.

在docker-compose.yml文件所在目錄運行 docker-compose up 命令,創建名稱分別為dns_master和dns_slave的容器。

配置DNS Master伺服器

1.我們進入dns_master容器

docker exec -it dns_master /bin/bash

2.安裝bind9 dns package

yum install bind bind-utils -y

3.修改配置文件named.conf

vim /etc/named.conf

注意以雙星號(**)包圍的內容,只是為了強調,實際配置時應去掉

options {
listen-on port 53 { 127.0.0.1; **192.168.254.10;** }; //Master Dns Ip
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { localhost; **192.168.254.0/24;** }; // IP Ranges
allow-transfer { localhost; **192.168.254.11;**}; // Slave Ip
......
....
zone "." IN {
type hint;
file "named.ca";
};
**
zone "elong.com" IN {
type master;
file "forward.yanggy"; // 正向解析文件
allow-update { none; };
};
zone "254.168.192.in-addr.arpa" IN {
type master;
file "reverse.yanggy"; // 反向解析文件
allow-update { none;};
};
**
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

  1. 配置正向解析文件forward.yanggy

vim /var/named/forward.yanggy
$TTL 86400
@ IN SOA masterdns.yanggy.com. root.yanggy.com. (
2019011201 ;Serial
3600 ;Refresh
1800 ;Retry
64800 ;Expire
86400 ;Minimum TTL
)
@ IN NS masterdns.yanggy.com.
@ IN NS slavedns.yanggy.com.
@ IN A 192.168.254.10
@ IN A 192.168.254.11
masterdns IN A 192.168.254.10
slavedns IN A 192.168.254.11

4.配置反向解析文件

vim /var/named/reverse.yanggy
$TTL 86400
@ IN SOA masterdns.yanggy.com. root.yanggy.com. (
2019011301 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
@ IN NS masterdns.yanggy.com.
@ IN NS slavedns.yanggy.com.
@ IN PTR yanggy.com.
masterdns IN A 192.168.254.10
slavedns IN A 192.168.254.11
10 IN PTR masterdns.yanggy.com.
11 IN PTR slavedns.yanggy.com.

5.檢查配置文件的正確性

named-checkconf /etc/named.conf
named-checkzone yanggy.com /var/named/forward.yanggy
named-checkzone yanggy.com /var/named/reverse.yanggy

第一條命令如果沒錯誤,什麼都不會輸出,後面兩條命令如果沒錯誤,則輸出內容包含OK.

6.啟動named服務

systemctl enable named
systemctl start named

7.配置相關文件所屬用戶和組

chgrp named -R /var/named
chown -v root:named /etc/named.conf
restorecon -rv /var/named
restorecon /etc/named.conf

8.安裝配置完成,開始測試

dig masterdns.yanggy.com
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> masterdns.yanggy.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65011
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;masterdns.yanggy.com. IN A
;; ANSWER SECTION:
masterdns.yanggy.com. 86400 IN A 192.168.254.10
;; AUTHORITY SECTION:
yanggy.com. 86400 IN NS masterdns.yanggy.com.
yanggy.com. 86400 IN NS slavedns.yanggy.com.
;; ADDITIONAL SECTION:
slavedns.yanggy.com. 86400 IN A 192.168.254.11
;; Query time: 19 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Mon Jan 14 09:56:22 UTC 2019
;; MSG SIZE rcvd: 117

  1. 退出容器後,將此容器保存為image:dns_image,以後dns_master就用此image

docker commit dns_master dns_master

配置DNS Slave伺服器

1.進入容器和安裝bind。

yum install bind bind-utils -y

2.配置named.conf

options {
listen-on port 53 { 127.0.0.1; 192.168.254.11;};
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { localhost;192.168.254.0/24;};
....
....
zone "yanggy.com" IN {
type slave;
file "slaves/yanggy.fwd";
masters {192.168.254.10;};
};
zone "254.168.192.in-addr.arpa" IN {
type slave;
file "slaves/yanggy.rev";
masters {192.168.254.10;};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

3.啟動dns服務

systemctl enable named
systemctl start named

4.啟動成功後,就會在目錄/var/named/slaves/下出現yagnggy.fwd和yanggy.rev,不用手動配置

5.配置相關文件的所屬用戶和用戶組

chgrp named -R /var/named
chown -v root:named /etc/named.conf
restorecon -rv /var/named
restorecon /etc/named.conf

6.配置完後,也可照上面方法測試,看是否正常。

7.退出窗器後,將此容器保存為image:dns_slave,以後dns_slave就用此image

LVS+KeepAlived

1.在dns的docker-compose.yum添加如下內容,創建lvs和openresty容器

lvs01:
image: centos:latest
container_name: lvs01
hostname: lvs01
privileged: true
dns:
- 192.168.254.10
- 192.168.254.11
volumes:
- /home/yanggy/docker/lvs01/:/home/yanggy/
- /home/yanggy/docker/lvs01/etc/:/etc/keepalived/
networks:
br0:
ipv4_address: 192.168.254.13
lvs02:
image: centos:latest
container_name: lvs02
hostname: lvs02
privileged: true
dns:
- 192.168.254.10
- 192.168.254.11
volumes:
- /home/yanggy/docker/lvs02/:/home/yanggy/
- /home/yanggy/docker/lvs02/etc/:/etc/keepalived/
networks:
br0:
ipv4_address: 192.168.254.14
resty01:
image: centos:latest
container_name: resty01
hostname: resty01
privileged: true
expose:
- "80"
dns:
- 192.168.254.10
- 192.168.254.11
volumes:
- /home/yanggy/docker/web/web01/:/home/yanggy/
networks:
br0:
ipv4_address: 192.168.254.15
resty02:
image: centos:latest
container_name: web02
hostname: web02
privileged: true
expose:
- "80"
dns:
- 192.168.254.10
- 192.168.254.11
volumes:
- /home/yanggy/docker/web/web02/:/home/yanggy/
networks:
br0:
ipv4_address: 192.168.254.16

2.創建lvs01和lvs02容器

docker-compose up

3.進入lvs01容器中,安裝ipvsadm和keepalived

yum install ipvsadm -y
yum install keepalived -y

4.配置keepalived

$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_01 #表示運行keepalived伺服器的一個標識。
}
vrrp_instance VI_1 {
state MASTER #指定keepalived的角色,MASTER表示此主機是主伺服器,BACKUP表示此主機是備用伺服器
interface eth0 #指定HA監測的網卡
virtual_router_id 51 #虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用唯一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的
priority 110 #定義優先順序,數字越大,優先順序越高,在同一個vrrp_instance下,MASTER的優先順序必須大於BACKUP的優先順序
advert_int 1 #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
authentication { #設置驗證類型和密碼
auth_type PASS #設置驗證類型,主要有PASS和AH兩種
auth_pass 1111 #設置驗證密碼,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通信
}
virtual_ipaddress { #設置虛擬IP地址,可以設置多個虛擬IP地址,每行一個
192.168.254.100
}
}
virtual_server 192.168.254.100 80 {
delay_loop 6 #設置運行情況檢查時間,單位是秒
lb_algo rr #設置負載調度演算法,這裡設置為rr,即輪詢演算法
lb_kind DR #設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選
persistence_timeout 0 #會話保持時間,單位是秒。這個選項對動態網頁是非常有用的,為集群系統中的session共享提供了一個很好的解決方案。
#有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話的保持時間。
#需要注意的是,這個會話保持時間是最大無響應超時時間,也就是說,用戶在操作動態頁面時,如果50秒內沒有執行任何操作
#那麼接下來的操作會被分發到另外的節點,但是如果用戶一直在操作動態頁面,則不受50秒的時間限制
protocol TCP #指定轉發協議類型,有TCP和UDP兩種
real_server 192.168.254.15 80 {
weight 1 #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小可以為不同性能的伺服器
#分配不同的負載,可以為性能高的伺服器設置較高的權值,而為性能較低的伺服器設置相對較低的權值,這樣才能合理地利用和分配系統資源
TCP_CHECK {
connect_port 80
connect_timeout 3 #表示3秒無響應超時
nb_get_retry 3 #表示重試次數
delay_before_retry 3 #表示重試間隔
}
}
real_server 192.168.254.16 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

從上面的配置可以看到真實的伺服器(RS)地址是192.168.254.15和192.168.254.16.

另一台LVS容器也是如此配置,不過需要修改router_id 為LVS_02,state為BACKUP,priority設置的比MASTER低一點,比如100.

在兩台lvs上分別執行如下命令,啟動keepalived

systemctl enable keepalived
systemctl start keepalived

5.登錄到上面兩台RS容器上,編寫如下腳本,假設名稱為rs.sh

為lo:0綁定VIP地址、抑制ARP廣播

#!/bin/bash
ifconfig lo:0 192.168.254.100 broadcast 192.168.254.100 netmask 255.255.255.255 up
route add -host 192.168.254.100 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &>/dev/null

腳本編寫完畢後,將腳本設置成可執行,然後運行。使用ifconfig命令檢查配置結果 .

Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群

6.登錄到lvs

使用ipvsadm命令查看映射狀態(要想得到下圖,還需要在192.168.254.15和192.168.254.16容器中安裝openresty並啟動,見下面openresty部分)

ipvsadm -Ln

Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群

7.測試keepalived監測狀態

將192.168.254.16:80服務關閉

docker stop web02

再次使用ipvsadm查看狀態,可以看見IP:192.168.254.16:80已經剔除,以後的請求都轉發到192.168.254.15:80上。

Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群

8.退出容器,使用docker commit lvs01 lvs,保存為lvs鏡像,修改docker-compose.yml文件中lvs01和lvs02的image值為lvs:latest.


以後啟動容器resty01和resty02之後,需要手動執行一下rs.sh腳本

OpenResty

1.創建並啟動resty01容器,然後進入容器中

安裝就不介紹了,自行看官網上安裝說明。

安裝完之後,在用戶的目錄中執行如下命令:

mkdir ~/work
cd ~/work
mkdir logs/ conf/

然後在conf目錄下新建nginx.conf配置文件,填寫如下內容:

[root@centos7 docker]# vim web/resty01/work/conf/nginx.conf
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
upstream web-group1 {
server 192.168.254.17:80 weight=1;
server 192.168.254.18:80 weight=1;
}
server {
listen 80;
location / {
default_type text/html;
proxy_pass http://web-group1;
}
}
}

192.168.254.17和192.168.254.18是上游web伺服器的IP,負載均衡方法還可以配置權重或Hash方式。

退出容器,然後使用docker commit resty01 openresty.保存為openresty鏡像。

2.修改docker-compose.yml,將resty01和resty02容器image屬性都個性為openresty,執行docker-compose up,執行成功後進入容器resty02,此時容器resty02中已經安裝了openresty,同樣需要在用戶Home目錄下創建work、conf、logs。


resty01和resty02容器都映射了宿主機的文件系統,請看docker-compose.yml文件中配置的volumes屬性,所以可以在配置resty02之前,將resty01的配置複製到resty02。

修改nginx.conf

worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
upstream web-group2 {
server 192.168.254.19:80 weight=1;
server 192.168.254.20:80 weight=1;
server 192.168.254.21:80 weight=1;
}
server {
listen 80;
server_name 192.168.254.16;
location / {
proxy_pass http://web-group2;
}
}
}

配置完openresty之後,啟動nginx.

nginx -c /home/yanggy/work/conf/nginx.conf

可以使用netstat -nltp 檢查一下80埠服務是否開啟

可以將nginx註冊為系統服務,以便容器啟動時自動運行

Web應用

1.修改docker-compose.yml,添加如下內容

web01:
image: centos:latest
container_name: web01
hostname: web01
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/web01/conf/:/etc/httpd/conf/
- /home/yanggy/docker/web/web01/www/:/var/www/
networks:
br0:
ipv4_address: 192.168.254.17

2.創建並啟動容器web01

進入容器之後,安裝httpd

yum install -y httpd

3.編輯主配置文件

vim /etc/httpd/conf/httpd.conf

ServerName前的#去掉,並將服務名稱個性為Web01

4.創建index.html

cd /var/www/html/
echo "<h1>Web01</h1>" > index.html

5.啟動服務

systemctl enable httpd
systemctl start httpd

6.退出容器,並將容器保存為鏡像web

7.向docker-compose.yml添加如下內容

web02:
image: web:latest
container_name: web02
hostname: web02
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/web02/conf/:/etc/httpd/conf/
- /home/yanggy/docker/web/web02/www/:/var/www/
networks:
br0:
ipv4_address: 192.168.254.18
web03:
image: web:latest
container_name: web03
hostname: web03
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/web03/conf/:/etc/httpd/conf/
- /home/yanggy/docker/web/web03/www/:/var/www/
networks:
br0:
ipv4_address: 192.168.254.19
web04:
image: web:latest
container_name: web04
hostname: web04
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/web04/conf/:/etc/httpd/conf/
- /home/yanggy/docker/web/web04/www/:/var/www/
networks:
br0:
ipv4_address: 192.168.254.20
web05:
image: web:latest
container_name: web05
hostname: web05
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/web05/conf/:/etc/httpd/conf/
- /home/yanggy/docker/web/web05/www/:/var/www/
networks:
br0:
ipv4_address: 192.168.254.21

8.將web01在宿主機上映射的文件夾複製四份,分別命令web01,web03,web04,web05,並修改其中的httpd.conf和index.html為相應的伺服器名稱

9.使用docker-compose up創建web02-05容器,此時容器內就已經啟動了web服務。

打通DNS和LVS

在上面LVS部分,配置了一個虛擬IP:192.168.254.100,現我將其添加到DNS伺服器中,當輸入域名時,能夠解析到這個虛擬IP。

1.進入dns_master容器,修改正向解析配置文件

[root@dns_master /]# vim /var/named/forward.yanggy

添加正向解析www.yanggy.com->192.168.254.100,並使用了別名webserver。

$TTL 86400
@ IN SOA masterdns.yanggy.com. root.yanggy.com. (
2019011201 ;Serial
3600 ;Refresh
1800 ;Retry
64800 ;Expire
86400 ;Minimum TTL
)
@ IN NS masterdns.yanggy.com.
@ IN NS slavedns.yanggy.com.
@ IN A 192.168.254.10
@ IN A 192.168.254.11
@ IN A 192.168.254.100
masterdns IN A 192.168.254.10
slavedns IN A 192.168.254.11
webserver IN A 192.168.254.100
www CNAME webserver

2.修改反向解析文件

vim /var/named/reverse.yanggy

192.168.254.100->webserver.yanggy.com

$TTL 86400
@ IN SOA masterdns.yanggy.com. root.yanggy.com. (
2019011301 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
@ IN NS masterdns.yanggy.com.
@ IN NS slavedns.yanggy.com.
@ IN NS webserver.yanggy.com.
@ IN PTR yanggy.com.
masterdns IN A 192.168.254.10
slavedns IN A 192.168.254.11
webserver IN A 192.168.254.100
10 IN PTR masterdns.yanggy.com.
11 IN PTR slavedns.yanggy.com.
100 IN PTR webserver.yanggy.com.
www CNAME webserver

總結

在宿主機的/etc/resolv.conf配置文件中添加DNS伺服器IP

# Generated by NetworkManager
nameserver 192.168.254.10
nameserver 192.168.254.11

在瀏覽器中輸入www.yanggy.com時,首先經DNS伺服器解析成192.168.254.100,再經由keepalived轉到其中一個openresty nginx伺服器,然後nginx伺服器再轉到其上游的一個web應用伺服器。

DNS和LVS都是高可用的,其中一台宕機,仍能響應瀏覽器請求,openresty伺服器也是高可用的,只有DNS和LVS伺服器可用,就會將請求分發到可用的openresty上,openresty不可用時,LVS就將其摘掉,可用時再恢復。同樣,web伺服器也是高可用的,openresty可以監測到其上游web應用伺服器的可用狀態,做到動態摘除和恢復。

完整的docker-compose.yml文件內容如下:

version: "3.7"
services:
dns_master:
image: dns_master:latest
container_name: dns_master
hostname: dns_master
privileged: true
dns:
- 192.168.254.10
volumes:
- /home/yanggy/docker/dns/master/:/home/yanggy/
networks:
br0:
ipv4_address: 192.168.254.10
dns_slave:
image: dns_slave:latest
container_name: dns_slave
hostname: dns_slave
privileged: true
dns:
- 192.168.254.10
- 192.168.254.11
volumes:
- /home/yanggy/docker/dns/slave/:/home/yanggy/
networks:
br0:
ipv4_address: 192.168.254.11
client:
image: centos:latest
container_name: client
hostname: client
privileged: true
dns:
- 192.168.254.10
- 192.168.254.11
volumes:
- /home/yanggy/docker/client/:/home/yanggy/
networks:
br0:
ipv4_address: 192.168.254.12
lvs01:
image: lvs:latest
container_name: lvs01
hostname: lvs01
privileged: true
volumes:
- /home/yanggy/docker/lvs01/:/home/yanggy/
- /home/yanggy/docker/lvs01/etc/:/etc/keepalived/
networks:
br0:
ipv4_address: 192.168.254.13
lvs02:
image: lvs:latest
container_name: lvs02
hostname: lvs02
privileged: true
volumes:
- /home/yanggy/docker/lvs02/:/home/yanggy/
- /home/yanggy/docker/lvs02/etc/:/etc/keepalived/
networks:
br0:
ipv4_address: 192.168.254.14
resty01:
image: openresty:latest
container_name: resty01
hostname: resty01
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/resty01/:/home/yanggy/
networks:
br0:
ipv4_address: 192.168.254.15
resty02:
image: openresty:latest
container_name: resty02
hostname: resty02
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/resty02/:/home/yanggy/
networks:
br0:
ipv4_address: 192.168.254.16
web01:
image: web:latest
container_name: web01
hostname: web01
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/web01/conf/:/etc/httpd/conf/
- /home/yanggy/docker/web/web01/www/:/var/www/
networks:
br0:
ipv4_address: 192.168.254.17
web02:
image: web:latest
container_name: web02
hostname: web02
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/web02/conf/:/etc/httpd/conf/
- /home/yanggy/docker/web/web02/www/:/var/www/
networks:
br0:
ipv4_address: 192.168.254.18
web03:
image: web:latest
container_name: web03
hostname: web03
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/web03/conf/:/etc/httpd/conf/
- /home/yanggy/docker/web/web03/www/:/var/www/
networks:
br0:
ipv4_address: 192.168.254.19
web04:
image: web:latest
container_name: web04
hostname: web04
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/web04/conf/:/etc/httpd/conf/
- /home/yanggy/docker/web/web04/www/:/var/www/
networks:
br0:
ipv4_address: 192.168.254.20
web05:
image: web:latest
container_name: web05
hostname: web05
privileged: true
expose:
- "80"
volumes:
- /home/yanggy/docker/web/web05/conf/:/etc/httpd/conf/
- /home/yanggy/docker/web/web05/www/:/var/www/
networks:
br0:
ipv4_address: 192.168.254.21
networks:
br0:
driver: bridge
ipam:
driver: default
config:
-
subnet: 192.168.254.0/24

演示

命令行curl訪問

Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群

瀏覽器訪問

Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群

其它的比如停止一台openresty伺服器或web應用伺服器,請自行驗證,最終目的是看能否自動摘除和恢復。

問題

1.MacOS無法直接訪問容器

官網上有說明,Mac系統中無法直接從Mac中直接通過IP訪問容器

Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群

如果有知道如何訪問的朋友,麻煩告知。

2.使用ipvsadm -Ln命令時,提示ip_vs模塊不存在

原因可能是宿主機的linux內核不支持也可能是宿主機沒載入內ip_vs模塊

查看宿主機內核,一般高於3.10都可以。
uname -a

檢查宿主機是否已載入ip_vs模塊

lsmod | grep ip_vs

如果沒出來結果,則使用modprobe命令載入,載入完後,再使用lsmod檢查一下。

modprobe ip_vs

3.上面架構的問題

由於最下層Web應用是分組的,如果其中一組所有Web伺服器都宕機,則需要將上游的openresty也關掉,這樣lvs才不會將流量轉到已經沒有可用的web應用那一組。

作者:單行線的旋律

原文:https://www.cnblogs.com/mycodingworld/p/dns_lvs_openresty.html

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

node刪除當前文件夾下的所有文件和文件夾(不包括當前文件夾)
終於有人把「TCC分散式事務」實現原理講明白了!

TAG:程序員小新人學習 |