離線版centos8環境部署遷移監控操作筆記

程式設計師修煉之旅發表於2021-12-31

  嗨咯,前兩天總結記錄了離線版centos8下docker的部署筆記,今天正好是2021年的最後一天,今天正好坐在本次出差回家的列車上,車上沒有上面事做,索性不如把本次離線版centos8環境安裝的其他過程做一次總結記錄,豈不美哉。

       Haha,文筆有限,技術更是有限,就當一次操作總結,如有說的不妥之處,歡迎指教,多多海涵。

1.    背景說明

  開始之前,還是簡單說明一下環境背景,不然看了一頭霧水,不知所云,本次環境部署是基於離線centos8作業系統,以docker為容器,部署前端網站+業務API應用。關於離線版centos8 的docker部署在前一篇文章中已經做了總結,本次主要記錄centos下的相關應用部署,包括:基礎映象遷移、業務API部署、服務監控。

2.    基礎映象遷移

  本次環境部署涉及到的基礎映象包括:nginx、.netcore相關環境,基礎映象的遷移思路:找一臺部署好的線上伺服器環境,然後將映象拷貝到離線環境即可,下面以nginx的遷移為例子,其他的都是依葫蘆畫瓢即可。

2.1拷貝nginx映象

  登入到部署了nginx的服務環境,通過執行以下命令即可拷貝nginx映象

  

docker save -o /home/installpack/nginx.zip nginx

  

  引數說明:docker save -o 【生成的映象的存放路徑】 【映象名稱】

  將生成好的映象檔案nginx.zip拷貝到離線伺服器上,我一般還是放在/home/ installpack目錄下。

2.2伺服器映象還原

  多的不說少的不嘮,直接執行以下命令即可:

# 進入到映象所在資料夾

cd /home/installpack

# 還原映象

docker load < nginx.zip

# 檢視映象

docker images

  

  看到下面的映象列表有nginx,大功告成

 

  nginx的具體配置就不寫了,根據自己實際需要配置即可

3.    業務API部署

  其實API部署就簡單了,直接將釋出檔案拷貝到伺服器指定目錄,生成映象+執行映象即可。

  我一般會寫一個services.sh檔案,並將其放在/home/sh/services.sh,把該伺服器上涉及的所有服務都寫成批處理命令,這樣方便快速安裝部署,具體檔案內容如下:

#!/bin/bash

# 該命令分兩部分:第一部分,全部重新部署安裝;第二部分:指定服務部署安裝

restartContainers="$1" 

if [ ! $restartContainers ]; then

    #重啟全部服務

    #部署安裝使用者服務

    echo "使用者服務啟動中 ..."

    docker rm -f usermic && docker rmi user

    docker build -t user /home/project/user && docker run -d -m 1024M --memory-swap -1 --restart=always --name usermic -p 8081:8081 -v /home/app/user/Log:/app/Log -v /home/app/user/wwwroot:/app/wwwroot user

    echo "日誌服務啟動中 ..."

    docker rm -f logmic && docker rmi log

    docker build -t log /home/project/log && docker run -d -m 1024M --memory-swap -1 --restart=always --name logmic -p 8086:8086 -v /home/app/log/Log:/app/Log -v /home/app/log/wwwroot:/app/wwwroot log
   
    # 依葫蘆畫瓢部署其他服務

 else

       #啟動指定的服務,不同服務間通過,連結

        #對IFS變數 進行替換處理

        OLD_IFS="$IFS"

        IFS=","

        restartContainersArray=($restartContainers)

        IFS="$OLD_IFS"

        for var in ${restartContainersArray[@]}

        do

           case $var in

            "usermic")

                        echo "使用者服務啟動中 ..."

                        docker rm -f usermic && docker rmi user

                        docker build -t user /home/project/user && docker run -d -m 1024M --memory-swap -1 --restart=always –name usermic -p 8081:8081 -v /home/app/user/Log:/app/Log -v /home/app/user/wwwroot:/app/wwwroot user

                        ;;             

                "logmic")

                        echo "日誌服務啟動中 ..."

                        docker rm -f logmic && docker rmi log

                        docker build -t log /home/project/log && docker run -d -m 1024M --memory-swap -1 --restart=always --name logmic -p 8086:8086  -v /home/app/log/Log:/app/Log -v /home/app/log/prologs:/app/prologs -v /home/app/log/wwwroot:/app/wwwroot log

                        ;;

                # 依葫蘆畫瓢部署其他服務

                esac

        done

fi

 # 檢視服務容器是否正常執行

docker ps -a

  

  服務啟動命令說明:其實run命令相信您一點都不陌生,只是有三點個需要注意:

  • --restart=always不要漏掉,他會幫助您重啟docker時自動啟動服務
  • -m 1024M 最好配置,他是設定容器的最大消耗記憶體,當記憶體消耗達到設定砸值,服務會自動重啟,具體值根據自身伺服器環境配置。
  • -v /宿主機目錄:/容器目錄 檔案掛載不能少,將配置檔案、日誌檔案、資料檔案、靜態資原始檔最好掛載對映到物理主機,避免容器銷燬到不回來資料,具體要掛載那一些檔案,根據具體的服務自己定義。

檔案執行示例說明:

# 初始化部署全部服務

sh /home/sh/services.sh

# 部署安裝某一個服務,如使用者服務:

sh /home/sh/services.sh usermic

# 部署安裝多個服務,如使用者服務、日誌服務:

sh /home/sh/services.sh usermic, logmic

  

業務部署方式說明:有很多大佬在部署的時候,直接將整個API服務掛載的物理機,除第一次初始化建立的容器服務需要用到上述命令外,其他升級只需要將更新包上傳到指定掛載的物理機,重啟對應的容器即可,這是一個很好的方法。

4.    服務監控

服務監控,其實有很多視覺化的第三方工具來完成,我還是用的最原始的方式來監控,那就是通過centos crontab的定時任務來監控容器和服務響應來實現。
具體監控思路分兩個方面的服務監控:基礎服務監控、業務服務監控
基礎服務監控:通過監聽容器狀態是否正常,如果不正常直接重啟一次服務,如:nginx等
業務服務監控:業務服務沒有直接通過監控容器狀態來實現,因為有遇到過,容器正常執行,但是服務不能提供對外服務,這樣監控也是徒勞的,所以業務服務直接呼叫服務的健康檢查介面,如果不能調通,那麼說已經不能正常提供服務,直接執行services.sh來初始化對應的服務。

4.1監控命令檔案準備

監控命令檔案我一般也會在每一個服務上寫一個/home/sh/serviceGuard.sh,將該服務對應的所有服務監控寫在此檔案中,具體檔案內容如下:
#!/bin/sh
# 先定義實現檢查的方法
# 檢查一個映象是否存在
function checkContainerStats
{
           exist=`docker inspect --format '{{.State.Running}}' $1`
           if [ "${exist}" != "true" ]
           then
                 return 0 
           else
                  return 1 
           fi
}
 
# 檢查一個服務是否正常提供服務(通過健康檢查地址來判斷是否正常提供服務)
function checkContainerHealthStats
{
   webUrl="$1"
   serviceCode=$(curl -I -m 10 -X GET -o  -s -w %{http_code} $webUrl)     
           if [ $serviceCode -eq 200 ]
           then
                  return 1
           else
                  return 0
           fi
}
 
# 根據名稱檢查容器的執行狀態,如果不存在,並重啟
function checkContainer
{
    #容器名稱
           containerName="$1"
           echo ""
           echo "開始檢查${containerName}的執行狀態"
 
           # 檢視程式是否存在
           # 判斷服務是否存在,如果不存在,那麼直接重啟一次
           if checkContainerStats ${containerName}
           then
                 echo "服務斷開,開始重啟服務"
                 docker start ${containerName}
                 echo "重啟完成"
           else
                 echo "正常服務中..." 
           fi
}
 
# 通過檢查檢查地址,檢查服務是否正常提供服務,並做自動修復
function checkContainerHealth
{
           #容器名稱
           containerName="$1"
           echo ""
           echo "開始檢查${containerName}的執行狀態"
 
           # 判斷服務是否存在,如果不存在,那麼先直接重啟一次,重啟後,在檢查一次,如果還是不存在,那麼直接刪除掉容器重新建立容器
           if checkContainerHealthStats $2; then
                 echo "服務斷開,開始重啟服務" 
                 docker start ${containerName}
                 # 在通過程式檢查一次是否重啟成功,如果失敗,那麼直接刪掉,映象,容器,重啟建立
                 if checkContainerStats ${containerName}; then
                      echo "重啟失敗,直接全新部署" 
                      sh /home/sh/services_22.sh ${containerName}
                      echo "全新部署完成" 
                   else
                      echo "重啟完成"
                fi
                else
                      echo "正常服務中..." 
               fi
          }
 
 
  #檢查分兩部分檢查,服務檢查+基礎容器檢查
 
  now=`date +"%Y-%m-%d %H:%M:%S"`
  echo
  echo "${now} 開始檢查docker中各個容器的對應的程式是否存在"
  #檢查基礎服務
  checkContainer nginx
 
  #檢查每一個業務服務的執行情況
  # 檢查使用者服務
  checkContainerHealth usermic http://localhost:8081/api/Consul/heathle
  # 檢查日誌服務
  checkContainerHealth logmic http://localhost:8086/api/Consul/heathle
  #其他服務

  

4.2啟動監控定時任務

多的不說少的不嘮,直接執行以下命令即可:

進入到 centos任務設定介面

              

crontab -e

 #所有任務檢查都是每一分鐘檢查一次

 * * * * * sh /home/sh/ serviceGuard.sh >> /var/log/cron_log_$(date +\%Y-\%m-\%d).log 2>&1

/ 退出儲存後 重啟centos

# 重新載入crond 重啟crond 設定crond為開機啟動
/sbin/service crond reload && /sbin/service crond restart && chkconfig crond on

  

5.    幾個注意點

  • 容器不能和外部服務通訊:如果資料庫連線等,此時最簡單粗暴的方式就是:直接關閉宿主機的防火牆,具體命令如下:
# 關閉防火牆

systemctl stop firewalld.service

# 設定開機禁止啟動防火牆,這一句不能忽視,不然重啟伺服器又開啟了

systemctl disable firewalld.service

  

  • 容器連線orcel資料庫問題,需要配置時區,不然orcle連線會報時區錯誤,時區設定直接在Dockerfile檔案中加上如下配置即可:

# 設定時區,是為了能夠訪問orcel資料庫

 

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

  

6.    結束

好了,時間剛剛好,也快要到站了,收拾收拾準備下車,寫的不好,希望有幫助就好。

END
為了更高的交流,歡迎大家關注我的公眾號,掃描下面二維碼即可關注,謝謝:

相關文章