嗨咯,前兩天總結記錄了離線版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
為了更高的交流,歡迎大家關注我的公眾號,掃描下面二維碼即可關注,謝謝: