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


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

環境

  • Centos 7
  • Docker

架構圖

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: bridge
     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命令檢查配置結果 .

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

ipvsadm -Ln

7.測試keepalived監測狀態
將192.168.254.16:80服務關閉

docker stop web02

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

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訪問

瀏覽器訪問

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

問題

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

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

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://docs.docker.com/compose/compose-file/
https://www.unixmen.com/setting-dns-server-centos-7/
https://blog.csdn.net/u012852986/article/details/52412174
http://blog.51cto.com/12227558/2096280
https://hub.docker.com/_/centos/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM