ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

来源:https://www.cnblogs.com/FlyLolo/archive/2019/10/31/ASPNETCore_28.html
-Advertisement-
Play Games

本文簡要說一下ASP.NET Core 在Docker中部署以及docker-compose的使用 (ASP.NET Core 系列目錄)。 系統環境為CentOS 8 。 先打個廣告:求職中,求坑,求推薦 一、概述 簡單說一下Docker的幾個概念: 記得上學的時候流行一種安裝操作系統的方式,叫G ...


本文簡要說一下ASP.NET Core 在Docker中部署以及docker-compose的使用  (ASP.NET Core 系列目錄)。 系統環境為CentOS 8 。 

先打個廣告:求職中,求坑,求推薦

一、概述

簡單說一下Docker的幾個概念:

記得上學的時候流行一種安裝操作系統的方式,叫GHOST,大概是這樣的:

進入PE系統打開GHOST軟體,點擊“local”,然後選擇“Partition”,最後選擇“From Image”,選擇一個.gho尾碼文件,就開始系統安裝了。

安裝好系統之後,根據自己的需求又安裝了一些常用軟體,然後為了避免下次重裝系統還要安裝這些,可以將現在狀態的系統再次用GHOST備份一下,生成一個.gho尾碼的鏡像文件,這個鏡像又可以用來安裝系統。

一個.gho文件可以用來為多臺電腦安裝系統,每個被安裝好的系統又可以被備份成一個.gho文件文件。

而類比Docker,有這樣幾個概念:

  1. Image(鏡像):有點像.gho尾碼的鏡像文件。
  2. Container(容器):就像用.gho安裝成功的一個操作系統。
  3. Repository(倉庫):存放鏡像的倉庫,像Git一樣可以有公有的倉庫也可以有私有的。微軟的倉庫地址為:

但實際上Docker不是一個操作系統,也不像一個虛擬機一樣,它是要共用宿主的內核的。

而且一般建議一個容器只跑一個進程,不像操作系統那樣可以多進程運行。(雖然也可以通過一些方法在一個Docker容器中跑多個應用,但不建議這樣做。)

二、安裝docker

     說明:安裝CentOS 8 選擇了最小安裝,此處就不說了,下麵說一下Docker的安裝過程。

  • 安裝一些必要的系統工具:

  sudo yum install -y yum-utils device-mapper-persistent-data lvm2

  • 添加軟體源信息:

  sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  • 更新 yum 緩存:

  sudo yum makecache fast

  • 安裝 Docker-ce:

  sudo yum -y install docker-ce

  • 啟動 Docker 後臺服務

  sudo systemctl start docker


  註意:安裝Docker-ce的時候可能報錯:package docker-ce …… requires containerd.io >= 1.2.2-3, but none of the providers can be installed
                  是因為containerd.io版本過低,可去下麵網站查看新版本:

                  https://download.docker.com/linux/centos/7/x86_64/edge/Packages

  • 下載:

  wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

  • 安裝:

  yum -y install containerd.io-1.2.6-3.3.el7.x86_64.rpm
  再次執行sudo yum -y install docker-ce安裝即可。

三、Docker的幾個常見命令

  • 搜索遠程存儲庫中的鏡像,例如MongoDB的鏡像
docker search mongo

  • 拉取倉庫中的鏡像
docker pull  mongo
  •  列出本地鏡像。
docker images

可以看到本地鏡像中包了mongo鏡像。

  • 運行鏡像生成一個容器
docker run --name mongotodocker -p 27088:27017 -d mongo

含義: 用鏡像mongo運行生成一個容器,名字為mongotodocker ,將容器內的埠27017映射到主機的27088埠。-p 指的是埠映射。 -d是說後臺運行容器,並返回容器ID;

  •  列出所有容器
docker ps -a 

可以看到剛運行起來的容器。

  • 停止容器
docker stop mongotodocker
  •  刪除容器
docker rm mongotodocker
  • 刪除鏡像
docker rmi mongo

 

 具體每個命令都有一些參數可用,這裡只是簡單介紹一下使用方法。具體的文檔網上很多,不一一說明瞭。

四、註冊Docker賬號

註冊一個賬號(可選項),地址:https://hub.docker.com/ ,可以在上面建自己的倉庫。

五、創建一個ASP.NET Core 項目,生成並運行Docker鏡像

新建一個名為DockerComposeDemo的API項目,直接發佈,拷貝發佈的文件到CentOS系統中,例如/home/aspcore目錄。併在該目錄新建一個文本文件名為Dockerfile,內容如下:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
COPY . .
ENTRYPOINT ["dotnet", "DockerComposeDemo.dll"]

含義是:引用包含3.0運行時的鏡像,這個鏡像在遠程倉庫中,若本地沒有提前pull下來,會先執行pull操作獲取到本地。然後將工作目錄設為/app , 拷貝發佈的項目文件,設置進程的入口是通過dotnet運行DockerComposeDemo.dll。

執行如下命令:

cd /home/aspcore
docker build -t dockertest .

 

註意第二行後後面有個'.'不能少。 含義就是按照Dockerfile文件中設置的規則生成名為dockertest的鏡像。

此時執行docker images命令可以看到本地鏡像中已經有了 mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim 和 dockertest 兩個鏡像。

運行這個鏡像生成容器:

docker run --name aspdocker -p 8080:80 -d dockertest

 

生成一個名為aspdocker 的容器,並將容器的80埠映射到主機的8080埠。訪問項目預設提供的controller:http://192.168.183.230:8080/WeatherForecast 

可以看到能正常訪問。 

六:使用docker-compose

因為一個Docker容器只建議運行一個應用,那麼一個項目就可能會存在多個容器被運行,可能包含多個項目、資料庫等,這時候就需要對這些容器進行統一的管理,從構建運行開始到運行後狀態的監控等。

這時候有個簡易的方法就是docker-compose,它可以完成多個Docker的統一管理,包括Docker鏡像構建、容器運行、相關配置以及Docker之間的依賴關係等。

下麵舉個簡單例子,這個DockerComposeDemo項目需要搭配一個MongoDB資料庫,這樣除了該項目外還需要一個Docker容器運行MongoDB資料庫。

這時候用docker-compose就方便多了。docker-compose的核心是docker-compose.yml文件,看一下對應這個例子的文件內容:

version: '3.4'

services:
  demomvc:
    image: thisdemoimage
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - ASPNETCORE_DBCONN=mongodb://192.168.183.230:27089
      - ASPNETCORE_DBNAME=dockerdb

    ports:
      - "5103:80"
    depends_on:
      - mongodocker
  mongodocker:
    image: mongo
    ports:
      - "27089:27017"

 在services節點下定義了demomvc和mongodocker兩個服務,一個是ASP.NET Core的項目,一個是MongoDB資料庫。

每個節點下的image參數指定了採用的鏡像名稱,ports指定埠映射。此處的MongoDB設置未涉及持久化,實際使用時要註意設置。

ASP.NET Core的項目的thisdemoimage鏡像是不存在的,下麵指定了build方法。當然也可以先創建好鏡像然後在這裡使用就像mongo服務的設置一樣。

depends_on表示本服務對另一個服務的依賴,本例中就是ASP.NET Core項目依賴MongoDB項目。

environment用於設置環境變數,作用是什麼呢?

有一些設置,比如本例中的資料庫連接,如果將連接字元串寫在了項目中的appsettings.json中,而這個文件被“固化”到鏡像中了,是不能修改的,除非重新生成鏡像,非常麻煩。

所以可以通過這樣的環境變數在外面設置。

將項目引用NuGet包MongoDB.Driver, 修改WeatherForecastController的get方法:

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            _mongoHelper.InsertOne(new WeatherForecast
            {
                Date = DateTime.Now.AddDays(1),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            });
            return _mongoHelper.FindList<WeatherForecast>();
        }

 每次都是先插入一條,然後返回所有記錄。這裡簡要的寫了一個mongoHelper:

    public class MongoHelper
    {
        private readonly IMongoDatabase database;
        public MongoHelper(IConfiguration configuration) : this(configuration["ASPNETCORE_DBCONN"], configuration.GetSection("ASPNETCORE_DBNAME").Value)
        {

        }
        public MongoHelper(string ConnectionString,string DBName)
        {
            MongoClient mongoClient = new MongoClient(ConnectionString);
            database = mongoClient.GetDatabase(DBName);
        }
        public List<T> FindList<T>(FilterDefinition<T> filter = null, string collectionName = null)
        {
            collectionName ??= typeof(T).Name;
            filter ??= new BsonDocument();
            var collection = database.GetCollection<T>(collectionName);
            return collection.Find(filter).ToList();
        }
        public void InsertOne<T>(T model, string collectionName = null)
        {
            collectionName ??= typeof(T).Name;
            var collection = database.GetCollection<T>(collectionName);
            collection.InsertOne(model);
        }
    }

 

連接字元串採用 IConfiguration中的設置。

這裡有個不算技巧的技巧,為了方便在非Docker的情況下測試,依然可以在appsettings.json文件中設置MongoDB的連接字元串,當部署到Docker中的時候,通過Docker環境變數配置的連接字元串會覆蓋appsettings.json中的配置。

這是因為在講述IConfiguration的文章中說過,系統是先載入appsettings.json中的設置,後載入環境變數中的設置的,二者的key相同,所以最終會以環境變數中的配置為準。

 重新發佈項目並將文件拷貝到/home/aspcore目錄,其中的dockerfile文件不變,添加本例中的docker-compose.yml文件。

docker-compose是需要單獨下載安裝的, 執行命令:

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如果提示許可權錯誤,需執行如下命令:

sudo chmod +x /usr/local/bin/docker-compose

安裝好之後執行 docker-compose --version 驗證是否安裝成功。

都準備好了,執行如下命令:

cd /home/aspcore
docker-compose up

 執行成功後訪問 http://192.168.183.230:5103/WeatherForecast 進行測試。

七、Windows下開發

我們都知道,VisualStudio經常“貼心”的幫我們做好多事,例如Git的圖形化操作。對於Docker也是如此。

若要在Windows環境下開發及調試Docker,可按下麵步驟完成。

首先需下載並安裝Docker Desktop

 頁面上有個圖標:,點擊下載。安裝後右下角會有 圖標,右鍵可以做一些設置。

它支持Windows和Linux兩種主機

通過docker version 命令可以看出當前主機類型。也可以右鍵點擊右下角的圖標,有個Switch to ……的選項,可以知道當前主機類型,點擊後切換到另一種類型。

命令切換:C:\Program Files\Docker\Docker\DockerCli.exe -SwitchDaemon

解決方案啟用Docker支持:

新建項目的時候,勾選啟用Docker支持:

 

已有項目可以右鍵點擊項目,添加Docker支持:

 

兩種方式都會要求選擇主機類型是Windows還是Linux。

此時Visual Studio幫我們會在項目中添加一個名為Dockerfile的文件:

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

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

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

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

 這個文件和上面例子中我們自己創建的優點不同,它包含了4個From,第一個和最後一個和我們自己創建的有點像,只是Visual Studio幫我們自動添加了SDK鏡像的拉取、項目的編譯、項目發佈的過程。

這裡用到了兩個鏡像,第一個From調用了微軟官方的包含ASP.NET Core 3.0 的運行時版鏡像。第二個From用到了包含.Net Core 3.0的SDK的鏡像,因為我們需要對項目進行生成和發佈操作。

通過添加Docker的支持,可以使用Visual Studio開發並將項目自動發佈到Docker進行調試。但選擇系統環境為Windows的時候速度很快,選擇Linux的時候由於網路問題非常慢。網上有臨時的解決方案。

如果多個項目想採用docker-compose管理,在上面添加docker支持的圖中可以看到有一個“容器業務流程協調程式支持”, 添加它就會自動生成一個docker-compose.yml文件。

 

Docker-Compose主要用於當前主機中的docker的管理,對於多主機的集群管理,就需要Docker Swarm或者Kubernetes了。


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

-Advertisement-
Play Games
更多相關文章
  • 這次我們翻譯了一篇Unity官方博客上的文章,原文題目為AN INTRODUCTION TO IL2CPP INTERNALS ,作者是從事Unity軟體開發的Joshua Peterson。文章的看點在於,它是以IL2CPP內部開發人員的角度來講述的,所以對於開發者來說非常有參考價值。 AN IN ...
  • 前言 進入一個領域,最直接有效的方法就是,尋找相關綜述性文章,首先你需要對你入門的領域有個概括性的瞭解,這些包括: 1、主流的學習社區與網站。 2、該領域的知名大牛與熱心分享的從業者。 3、如何有效的激勵自己持續學習—主要是動手實踐 因此,總結一下Unity相關學習資源,可能有些不足,歡迎大家指正修 ...
  • Aspose.Email for .NET是一套完整的電子郵件處理控制項,用於構建跨平臺應用程式,無需使用Microsoft Outlook即可創建,操作,轉換和傳輸電子郵件。API提供電子郵件處理功能,例如添加,提取或刪除郵件對象中的附件,通過添加或刪除收件人或更改主題等來自定義郵件頭。 Aspos ...
  • Aspose.PDF for .NET是一種高級PDF處理和解析API,用於在跨平臺應用程式中執行文檔管理和操作任務。API可以輕鬆用於生成,修改,轉換,渲染,保護和列印PDF文檔,而無需使用Adobe Acrobat。此外,還提供PDF壓縮選項,表格創建和操作,圖形和圖像功能,廣泛的超鏈接功能,印 ...
  • dotnet core gRPC 原文在本人公眾號中,歡迎關註我,時不時的會分享一些心得 HTTP和RPC是現代微服務架構中很常用的數據傳輸方式,兩者有很多相似之處,但是又有很大的不同。HTTP是一種規範性、通用性、非常標準的傳輸協議,幾乎所有的語言都支持,如果要確保各平臺無縫銜接,可以考慮使用HT ...
  • static void Main(string[] args) { SystemTimersDemo(); Console.ReadLine(); } static void SystemTimersDemo() { System.Timers.Timer timer = new System.Ti... ...
  • VisualStudio2019下一個2.2另一個3.0頁面修改如下,但是3.0刷新沒有任何變化,難道VS以後不能做前端開發了?大家可能沒有看官方文檔 根據文章所說你需要: 1.安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 包。 ...
  • 在上一篇 abp(net core)+easyui+efcore實現倉儲管理系統——EasyUI之貨物管理五 (二十三) 文章中,我們修正了一些BUG,讓貨物信息管理的前端與後臺功能基本實現了我們所要。現在我們運行起應用程式看看新增功能。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...