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

来源:https://www.cnblogs.com/88223100/archive/2023/04/30/The-most-comprehensive-solution-for-deploying-NET-Core-to-Linux-CentOS-Docker_Nginx__Jexus.html
-Advertisement-
Play Games

在前兩篇: .NET Core部署到linux(CentOS)最全解決方案,常規篇 .NET Core部署到linux(CentOS)最全解決方案,進階篇(Supervisor+Nginx) 我們對.netcore部署到linux有了一個充分的瞭解,已經可以滿足應用要求了,這篇文章我們繼續深入... ...


在前兩篇:

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

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

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

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/

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

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

Jexus的安裝

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

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

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

  1. port=8099 #埠
  2. hosts=* #功能變數名稱
  3. AppHost={cmd=dotnet Core50Test.dll; root=/root/app_data/core50test/publish; port=5000}

Jexus的配置

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

  1. /usr/jexus/jws restart

重啟jexus

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

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

  1. ps -aux

ps

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

瀏覽應用

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

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

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

Docker

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

Docker有如下優點:

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

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

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

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

2、響應式部署和擴展

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

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

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

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

執行如下命令:

  1. 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安裝1

docker安裝2

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

  1. systemctl enable docker

執行如下命令啟動docker:

  1. systemctl start docker

查看docker啟動狀態:

查看docker啟動狀態

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

yum install docker-ce-cli

查看docker版本命令:

查看docker版本

安裝docker之後,我們需要在代碼里增加dockerfile文件。

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

net core docker支持

生成的dockerfile文件如下所示:

  1. #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
  2.  
  3. FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
  4. WORKDIR /app
  5. EXPOSE 80
  6.  
  7. FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
  8. WORKDIR /src
  9. COPY ["Core50Test.csproj", ""]
  10. RUN dotnet restore "./Core50Test.csproj"
  11. COPY . .
  12. WORKDIR "/src/."
  13. RUN dotnet build "Core50Test.csproj" -c Release -o /app/build
  14.  
  15. FROM build AS publish
  16. RUN dotnet publish "Core50Test.csproj" -c Release -o /app/publish
  17.  
  18. FROM base AS final
  19. WORKDIR /app
  20. COPY --from=publish /app/publish .
  21. ENTRYPOINT ["dotnet", "Core50Test.dll"]

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

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

  1. git pull

拉取代碼

然後執行如下命令,將代碼打包為鏡像:

  1. docker build -f Dockerfile -t core50test .

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

打包鏡像

image-20210118173932286

打包完成後,執行如下命令,可查看當前伺服器已存在的鏡像:

  1. docker images

查看當前伺服器已存在的鏡像

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

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

執行結果如下:

docker run命令啟用我們的應用

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

應用成功運行

docker run :創建一個新的容器並運行一個命令

  1. 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: 綁定一個捲

可以通過編寫shell腳本,實現一鍵更新應用。在/root目錄中,創建dockerbuild.sh文件,文件內容如下:

  1. # !/bin/bash
  2.  
  3. cd /root/app_data/source/core50test
  4. git pull
  5. imtag=$(uuidgen |sed 's/-//g')
  6. docker build -f Dockerfile -t core50test:${imtag} .
  7. docker stop core50test
  8. docker rm core50test
  9. docker run -dit --restart=always --name core50test -p 81:80 core50test:${imtag}

docker一鍵更新應用shell腳本

給dockerbuild.sh文件設置執行許可權,命令如下:

  1. chmod 777 dockerbuild.sh

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

./dockerbuild.sh

執行dockerbuild.sh快速更新應用程式

image-20210118175843088

至此,.net core使用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常用命令

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

  1. docker --help

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

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

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

 

作者|國思軟體

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/The-most-comprehensive-solution-for-deploying-NET-Core-to-Linux-CentOS-Docker_Nginx__Jexus.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、前言 第二次在博客園上發佈面向對象程式設計題目集的總結博客。經過幾周的學習,面向對象的理念更加深入。雖然已經學了些面向對象程式設計,學好這部分內容還是有較大難度。 關於知識點 本次的題目集所體現的知識點已經不僅限於Java的語法知識,還需要考慮設計問題,不能看到題目就開始進行代碼編寫,需要考慮類 ...
  • B/S 結構系統的 緩存機制(Cookie) 以及基於 cookie 機制實現 oa 十天免登錄的功能 @ 每博一文案 嘿,大風揚起的沉沙中,每一粒都有它的必然性,而每個人的命運都有自己的因果, 為自己的選擇負責承擔或好或壞的結果。是成年人的必修課。 有人請教索羅斯投資的指導,我的父親一直追隨你炒股 ...
  • JSP 的本質原理解析:"編寫的時候是JSP,心裡想解讀的是 java 源碼" @ 每博一文案 活明白的人,一生只做好了這兩件事: 每個瞬間都充滿了選擇和承擔,就算面前是一座獨木橋,也必須選擇是前進後退,亦或是留在原地此時此刻你所經歷的一切。 這是過往無數個選擇後的結果,哪些小的選擇匯聚在了一起,最 ...
  • 一前言 題目集四主要考察的是對LocalDate,ArrayList,HashSet等Java自帶類的使用 題目集五主要考察的是對正則表達式的使用,以及對其題目集三的時間題目的進行類結構的改變 題目集六隻有一道題,主要是對題目集四的第一題進行加大難度 總的來說這幾次的題目量比前面幾次都要少,但是題目 ...
  • 構造 Socket 在【客戶端/服務端】的通信模式中,客戶端需要主動構造與伺服器連接的 Socket,構造方法有以下幾種重載形式: Socket() Socket(InetAddress address, int port) throws UnknownHostException,IOExcepti ...
  • 原文鏈接: 為什麼 Go for-range 的 value 值地址每次都一樣? 迴圈語句是一種常用的控制結構,在 Go 語言中,除了 for 關鍵字以外,還有一個 range 關鍵字,可以使用 for-range 迴圈迭代數組、切片、字元串、map 和 channel 這些數據類型。 但是在使用 ...
  • Springboot的優點 內置servlet容器,不需要在伺服器部署 tomcat。只需要將項目打成 jar 包,使用 java -jar xxx.jar一鍵式啟動項目 SpringBoot提供了starter,把常用庫聚合在一起,簡化複雜的環境配置,快速搭建spring應用環境 可以快速創建獨立 ...
  • Runtime包 GOMAXPROCS() ​ 用來設置可以並行計算的CPU核數最大值,並返回之前的值,具體使用方法上一篇有些,這裡不再贅述 Gosched() ​ 用於讓出CPU時間片,讓出當前goroutine的執行許可權,調度器安排其他等待的任務運行,併在下次某個時候從該位置恢復執行 Goexi ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...