.NET Core部署到linux(CentOS)最全解決方案,高階篇(Docker+Nginx 或 Jexus)

.NET快速開發框架發表於2021-01-26

在前兩篇:

.NET Core部署到linux(CentOS)最全解決方案,常規篇

.NET Core部署到linux(CentOS)最全解決方案,進階篇(Supervisor+Nginx)

我們對.netcore部署到linux有了一個充分的瞭解,已經可以滿足應用要求了,這篇文章我們繼續深入帶你瞭解使用Doker+jexus或Nginx來部署.net core應用。

1、使用Jexus作為web伺服器

Jexus是一款Linux平臺上的高效能WEB伺服器和負載均衡閘道器伺服器,以支援ASP.NET、ASP.NET CORE、PHP為特色,同時具備反向代理、入侵檢測等重要功能。可以這樣說,Jexus是.NET、.NET CORE跨平臺的最優秀的宿主伺服器,如果我們認為它是Linux平臺的IIS,這並不為過,因為,Jexus不但非常快,而且擁有IIS和其它Web伺服器所不具備的高度的安全性。同時,Jexus Web Server 是完全由中國人自主開發的的國產軟體,真正做到了“安全、可靠、可控”, 具備我國黨政機關和重要企事業單位資訊化建設所需要的關鍵品質。

jexus官網:https://www.jexus.org/

1.1、Jexus的安裝

jexus的安裝非常簡單,執行如下命令:

curl https://jexus.org/release/x64/install.sh|sudo sh

Jexus的安裝

注:執行安裝命令,需要操作者有root許可權。

1.2、Jexus的配置與使用

安裝完成後,切換到/usr/jexus目錄,修改/usr/jexus/siteconf目錄下的default,內容如下所示:

注:因為在前面的章節用了nginx,使用了80埠,因此這兒我使用8099埠。

port=8099 #埠
hosts=*    #域名
AppHost={cmd=dotnet Core50Test.dll; root=/root/app_data/core50test/publish; port=5000}

Jexus的配置

接下來,我們重啟jexus,執行如下命令:

/usr/jexus/jws restart

提示Ok後,我們的應用就表示啟動起來了。

可以通過執行如下命令,看下執行的結果:

ps -aux

可以看到我們的應用已經啟動起來了,到瀏覽器使用8099埠瀏覽看下效果。

關於jexus更詳細的使用說明,請參考官方文件。

1.3、Jexus的操作命令

Jexus包括如下操作命令(首先 cd /usr/jexus):
啟動:sudo ./jws start
停止:sudo ./jws stop
重啟:sudo ./jws restart

2、Docker+Nginx或Jexus部署

在前面的文章介紹中,不管是supervisor+nginx還是jexus,都需要在伺服器安裝 .NET Core的SDK或者執行時,假如我們們多個應用程式,各應用程式所用.net core版本不一樣,上面的做法就需要我們們分別安裝對應的SDK或者執行時,對於維護還是比較麻煩的。Docker的出現,可以完美解決上述問題。

2.1、Docker是什麼?

  • docker是一個開源的軟體部署解決方案;
  • docker也是輕量級的應用容器框架;
  • docker可以打包、釋出、執行任何的應用。

Docker有如下優點:

1、快速,一致地交付您的應用程式

Docker 允許開發人員使用您提供的應用程式或服務的本地容器在標準化環境中工作,從而簡化了開發的生命週期。

容器非常適合持續整合和持續交付(CI / CD)工作流程,請考慮以下示例方案:

  • 您的開發人員在本地編寫程式碼,並使用 Docker 容器與同事共享他們的工作。
  • 他們使用 Docker 將其應用程式推送到測試環境中,並執行自動或手動測試。
  • 當開發人員發現錯誤時,他們可以在開發環境中對其進行修復,然後將其重新部署到測試環境中,以進行測試和驗證。
  • 測試完成後,將修補程式推送給生產環境,就像將更新的映象推送到生產環境一樣簡單。

2、響應式部署和擴充套件

Docker 是基於容器的平臺,允許高度可移植的工作負載。Docker 容器可以在開發人員的本機上,資料中心的物理或虛擬機器上,雲服務上或混合環境中執行。

Docker 的可移植性和輕量級的特性,還可以使您輕鬆地完成動態管理的工作負擔,並根據業務需求指示,實時擴充套件或拆除應用程式和服務。

3、在同一硬體上執行更多工作負載

Docker 輕巧快速。它為基於虛擬機器管理程式的虛擬機器提供了可行、經濟、高效的替代方案,因此您可以利用更多的計算能力來實現業務目標。Docker 非常適合於高密度環境以及中小型部署,而您可以用更少的資源做更多的事情。

2.2、docker安裝

執行如下命令:

sudo yum install docker

PS:

遇報錯 Another app is currentlty holding the yum lock ,waiting for it to exit..

解決方法: rm –r /var/run/yum.pid 這個命令 解鎖即可


安裝完成後,執行如下命令設定docker開機啟動:

systemctl enable docker

執行如下命令啟動docker:

systemctl start docker

檢視docker啟動狀態:

檢視docker啟動狀態

ps:安裝過程有問題的話,可能直接執行如命令安裝。

yum install docker-ce-cli

檢視docker版本命令:

2.3、.net core docker支援

安裝docker之後,我們需要在程式碼裡增加dockerfile檔案。

通過Visual Studio可以幫我們自動生成,在解決方案中,右擊專案名稱,依次選擇【新增】->【Docker支援】,如下圖所示:

net core docker支援

生成的dockerfile檔案如下所示:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["Core50Test.csproj", ""]
RUN dotnet restore "./Core50Test.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "Core50Test.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Core50Test.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Core50Test.dll"]

將程式碼推送到git倉庫,然後再linux伺服器中拉取最新程式碼。

切換到/root/app_data/source/core50test目錄,執行如下命令,拉取最新程式碼:

git pull

然後執行如下命令,將程式碼打包為映象:

 docker build -f Dockerfile -t core50test .

首次打包映象涉及到拉取.NET Core的官方映象,拉取速度可能較慢,請耐心等待。


打包完成後,執行如下命令,可檢視當前伺服器已存在的映象:

docker images

檢視當前伺服器已存在的映象

映象打包完成後,我們就可以執行docker run命令啟用我們的應用了:

docker run -p 81:80 -dit --restart=always --name core50test core50test

執行結果如下:

docker run命令啟用我們的應用

通過瀏覽器訪問:http://ip:81。如無意外,我們可以看到應用已經成功執行。

docker run :建立一個新的容器並執行一個命令

語法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS說明:

  • -a stdin: 指定標準輸入輸出內容型別,可選 STDIN/STDOUT/STDERR 三項;
  • -d: 後臺執行容器,並返回容器ID;
  • -i: 以互動模式執行容器,通常與 -t 同時使用;
  • -P: 隨機埠對映,容器內部埠隨機對映到主機的埠
  • -p: 指定埠對映,格式為:主機(宿主)埠:容器埠
  • -t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
  • --name="nginx-lb": 為容器指定一個名稱;
  • --dns 8.8.8.8: 指定容器使用的DNS伺服器,預設和宿主一致;
  • --dns-search example.com: 指定容器DNS搜尋域名,預設和宿主一致;
  • -h "mars": 指定容器的hostname;
  • -e username="ritchie": 設定環境變數;
  • --env-file=[]: 從指定檔案讀入環境變數;
  • --cpuset="0-2" or --cpuset="0,1,2": 繫結容器到指定CPU執行;
  • -m :設定容器使用記憶體最大值;
  • --net="bridge": 指定容器的網路連線型別,支援 bridge/host/none/container: 四種型別;
  • --link=[]: 新增連結到另一個容器;
  • --expose=[]: 開放一個埠或一組埠;
  • --volume , -v: 繫結一個卷

2.4、通過shell指令碼實現docker一鍵更新應用

可以通過編寫shell指令碼,實現一鍵更新應用。在/root目錄中,建立dockerbuild.sh檔案,檔案內容如下:

# !/bin/bash

cd /root/app_data/source/core50test
git pull
imtag=$(uuidgen |sed 's/-//g')
docker build -f Dockerfile -t core50test:${imtag} .
docker stop core50test
docker rm core50test
docker run -dit --restart=always --name core50test -p 81:80  core50test:${imtag}

給dockerbuild.sh檔案設定執行許可權,命令如下:

chmod 777 dockerbuild.sh

當有新程式碼推送到git倉庫時,進入伺服器,執行dockerbuild.sh即可快速更新應用程式。

./dockerbuild.sh

至此,.net core使用docker方式部署介紹完成。

2.5、docker常用命令

Docker常用命令,總的來說分為以下幾種:

  • Docker環境資訊 — docker [info|version]
  • 容器生命週期管理 — docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
  • 容器操作運維 — docker [ps|inspect|top|attach|wait|export|port|rename|stat]
  • 容器rootfs命令 — docker [commit|cp|diff]
  • 映象倉庫 — docker [login|pull|push|search]
  • 本地映象管理 — docker [build|images|rmi|tag|save|import|load]
  • 容器資源管理 — docker [volume|network]
  • 系統日誌資訊 — docker [events|history|logs]

從docker命令使用出發,梳理出如下命令結構圖:

要檢視更詳細的命令,可以檢視官網或者命令幫助

docker --help

3、總結

通過前面三篇文章的介紹,我們已經對.net core多方案部署到linux下有了非常全面的認識,小型團隊已經足夠使用。留心的同學會注意到,雖然目前的方案可以實現一鍵部署更新,但是還是需要登陸到linux伺服器去執行相應的命令。

顯示,這不是最優的方案,那麼還有沒有更好的方案呢?比如:當我們提交給git倉庫後,自動出發部署命令是不是就更方便了呢?

答案是肯定的,我們可以藉助jenkins來實現。如有興趣,可以自行研究,或者敬請期待後面的講解。以及在大型專案中基於k8s實現的devops。其實k8s實現devops的原理以上面的介紹差不多,基於就是藉助gitlab的runner或者jenkins,監聽git倉庫的狀態,當發現指定的分支發生變化後,打包映象,然後通過替換k8s的deployment的映象來實現自動更新。同時,k8s實現了彈性伸縮、滾動更新等功能。


一路走來數個年頭,感謝RDIFramework.NET框架的支持者與使用者,大家可以通過下面的地址瞭解詳情。

RDIFramework.NET官方網站:http://www.rdiframework.net/

RDIFramework.NET官方部落格:http://blog.rdiframework.net/

特別說明,框架相關的技術文章請以官方網站為準,歡迎大家收藏!

RDIFramework.NET框架由海南國思軟體科技有限公司專業團隊長期打造、一直在更新、一直在升級,請放心使用!

歡迎關注RDIFramework.NET框架官方微信公眾號(微訊號:guosisoft),及時瞭解最新動態。

使用微信掃描二維碼立即關注

微訊號:guosisoft

相關文章