搭建 docker + nginx + keepalived 實現Web應用的高可用(親測)


 1. 環境准備

      下載 VMware : https://www.vmware.com/go/getplayer-win

       下載 Centos : https://mirrors.aliyun.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso

       下載之后安裝好 VMware,然后創建兩個 centos 虛擬機,具體安裝步驟直接按照界面提示操作即可,裝完操作系統之后重啟即可。

       主機IP:192.168.65.132  備機IP 192.168.65.129  將兩台機器都安裝好 docker ,nginx,keepalived 安裝方法如下面。

 2. 安裝啟動 docker

       yum -y install docker #參數 y 代表自動選擇,可以試一下不加 y 會是什么效果 

       問題:如果是首次使用這個命令,會報錯 cannot find a valid baseurl for repo : base/7/x86_64。

       解決:1.打開 vi /etc/sysconfig/network-scripts/ifcfg-ens33(每個機子都可能不一樣,但格式會是“ifcfg-ens數字”),把ONBOOT=no,改為ONBOOT=yes

            2.重啟網絡  service network restart

       問題: 如何校驗是否安裝成功 

      解決: 使用命令 docker -v ,會提示所安裝的 docker 的版本信息

       問題: 如何設置 docker 為開機自啟以及后台啟動

       解決: 1.開機自啟         systemctl enable docker

             2.啟動 docker    systemctl start docker

             3.檢查是否啟動    systemctl start docker

 3. 安裝啟動 nginx 

        1.鏡像加速:  https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors    (這里可能需要注冊一個阿里雲的賬號,用大佬的東西,注冊個賬號也不費事)

        

        2.拉取鏡像:docker pull nginx   #這里獲取的是最新的 nginx

        3.顯示已拉取的鏡像: docker images

        

       4.創建文件夾用於使用自己定義的配置文件以及日志文件

          mkdir -p /app/docker/nginx/conf  # 配置文件

          mkdir -p /app/docker/nginx/html   #主頁

          mkdir -p /app/docker/nginx/logs   #日志存放

       5.在 /app/docker/nginx/conf 目錄下創建配置文件: vi nginx.conf

nginx.conf

         在 /app/docker/nginx/html 目錄下創建首頁(僅僅是后面用來判斷請求落在了哪個機器上,主機和備機能區分開就行): vi  index.html  

Master machine IP: 192.168.65.132
index.html

        在 /app/docker/nginx/ 目錄下創建 docker 啟動文件: vi start.sh     

#!/bin/bash docker run --name docker-nginx --privileged=true --restart=always -p 80:80 \ -v /app/soft/docker-config/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /app/soft/docker-config/nginx/logs:/var/log/nginx \ -v /app/soft/docker-config/nginx/html:/usr/share/nginx/html \ -d nginx # --privileged=true 使用此參數 container內的root擁有真正的root權限 # --restart=always docker啟動時,自動重啟該容器 # -p 80:80 將容器的80端口映射到主機的80端口 # --name docker-nginx 容器的名字 # -v /app/soft/docker-config/nginx/conf/nginx.conf:/etc/nginx/nginx.conf # 掛載文件夾,將主機的文件夾掛載到容器的文件夾 \ # -v /app/soft/docker-config/nginx/logs:/var/log/nginx # -v /app/soft/docker-config/nginx/html:/usr/share/nginx/html # -d nginx   下載的容器的名字,不帶版本號就是最新的 
start.sh

      6.啟動 nginx  ./start.sh    (先執行 chmod +x start.sh 使得腳本可以執行)

        

     7.分別訪問兩個IP地址 

       主機:

                

       備機:

    

   8.查看日志進入 cd /app/docker/nginx/logs

5. 安裝 keepalived 

      1.yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel

       2.yum install -y keepalived

       3.修改配置文件 /etc/keepalived/keepalived.conf 

       主機和備機的配置文件在於:state 和 priority 兩個地方,修改下這里就行,主機初始狀態為 MASTER,優先級為100 備機初始狀態為BACKUP,優先級為80

! Configuration File for keepalived global_defs { # 全局配置 notification_email { 123@qq.com # 接受告警的郵箱 } notification_email_from sample@163.com # 指定發件人 smtp_server 192.168.200.1 # 指定的 smtp服務器地址 smtp_connect_timeout 30 # 指定 smtp 連接超時時間 router_id LVS_DEVEL # 負載均衡標識,在局域網應該是唯一的 vrrp_skip_check_adv_addr vrrp_strict #添加一個周期性執行的腳本。腳本的退出狀態碼會被調用它的所有的VRRP Instance記錄。 vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" # 指定要執行的腳本的路徑 interval 5 # 指定腳本執行的間隔。單位是秒。默認為1s。 } vrrp_instance VI_1 { state MASTER # 指定該keepalived節點的初始狀態 這里這個並不意味着他就是主機!!是根據下面比較 priority 值來判斷主機的 interface ens33 # vrrp實例綁定的接口,用於發送VRRP包 這里需要寫成 ifconfig 顯示的網卡名 virtual_router_id 51 # 指定VRRP實例ID,范圍是0-255 priority 100 # 指定優先級,優先級高的將成為MASTER advert_int 1 # 指定發送VRRP通告的間隔。單位是秒 authentication { auth_type PASS # 指定認證方式。PASS簡單密碼認證(推薦),AH:IPSEC認證(不推薦) auth_pass 1111 # 指定認證所使用的密碼。最多8位 } virtual_ipaddress { 192.168.65.135 # 指定VIP地址 } track_script { chk_nginx } }
View Code

      4.創建定時檢測 nginx 是否正常運行的腳本  (執行 chmod +x nginx_check.sh 使得腳本可以執行)

#!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then # /usr/bin/docker rstart docker-nginx  >> ./tmp/echo.log 2>> ./tmp/echo2.log #正常情況下這里需要重啟 nginx,這里已瘋,環境變量導致着無法識別命名 sleep 3
            if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
                        ps -ef|grep keepalived|grep -v grep|awk '{print $2}'|xargs kill -9
            fi
fi
nginx_check.sh

       大坑:這里是定時去調用這個腳本去檢測 nginx 有沒有正常運行,但是由於 crontab 的環境變量問題!腳本手動執行是可以執行的,但是運行就會報 "命令找不到",或者 "沒有權限",由於水平有限,研究了兩天還不知道怎么搞。附帶幾個鏈接,試過了但是還是沒有解決,后續等解決之后修改,請大佬指點。

        Linux中crontab的坑爹環境變量問題

        corantab 不能自動執行的一些問題-環境變量

        crontab定時任務自動不能執行,手動可以執行的解決辦法-親測解決

     5.啟動 keepalived 

      systemctl enable keepalived # 開機自啟動

       systemctl start keepalived     # 啟動

       systemctl stop keepalived     # 暫停

       systemctl restart keepalived  # 重啟

       systemctl status keepalived   # 查看狀態  

    6.查看日志

      tail -f /var/log/messages

6. 驗證

    第一種情況:兩個機器 nginx 都正常運行

      1.訪問 http://192.168.65.132/  頁面會顯示   "Master machine..... IP:192.168.65.132" 

       2.訪問 http://192.168.65.129/  頁面會顯示   "Slave machine ... IP:192.168.65.129" 

       3.訪問 http://192.168.65.135/  頁面會顯示   "Master machine..... IP:192.168.65.132"   說明現在 主機192.168.65.132 獲得 VIP 

       4.通過 cat /app/docker/logs/access.log 查看到訪問記錄,日志的格式也是配置文件中定義的

    第二種情況 : 主機 nginx 關閉

      1.關閉主機 docker : docker stop docker-nginx  (docker-nginx 是在 .start.sh 定義的容器的名稱)

        2.由於 keepalived 定時監控 nginx 運行狀態,發現 nginx 關閉了,此時會將 keepalived 關閉,備機獲得 VIP ,在關閉主機docker時,可以觀察備機的日志,tail -f /var/log/messages

        

        3.此時訪問  http://192.168.65.135/  頁面提示:  “Slave machine ... IP:192.168.65.129”

      4.查看備機 192.168.65.129 的 cat /app/docker/logs/access.log 能查看到訪問記錄

    第三種情況:主機 nginx 關閉之后重啟

      1.重啟主機 docker : docker restart docker-nginx  (docker-nginx 是在 .start.sh 定義的容器的名稱)

        2.重啟已關閉的 keepalived : systemctl restart keepalived 

        3.觀察主機和備機的日志 : tail -f /var/log/messages

          主機:

              

       備機:

           

         5.會發現主機馬上獲取到了 VIP,此時再訪問 http://192.168.65.135/  頁面會顯示   "Master machine..... IP:192.168.65.132"

7. 結束

  參考博客 : https://blog.51cto.com/andyxu/2286045

              https://blog.csdn.net/jomexiaotao/article/details/83271458

 

  水平有限,如有錯誤的地方,希望大家可以友情指出 你我共同進步,開開心心的就好

 


免責聲明!

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



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