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

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

Master machine IP: 192.168.65.132
在 /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 下載的容器的名字,不帶版本號就是最新的
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 } }
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 有沒有正常運行,但是由於 crontab 的環境變量問題!腳本手動執行是可以執行的,但是運行就會報 "命令找不到",或者 "沒有權限",由於水平有限,研究了兩天還不知道怎么搞。附帶幾個鏈接,試過了但是還是沒有解決,后續等解決之后修改,請大佬指點。
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
水平有限,如有錯誤的地方,希望大家可以友情指出 你我共同進步,開開心心的就好