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

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

2020-09-21 15:46:54 .NET開發

本文簡要說一下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了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/98028.html

標籤:.NET Core

上一篇:NetCore中帶圖片的word轉html (NPOI.Word2Html)

下一篇:abp(net core)+easyui+efcore實作倉儲管理系統——EasyUI之貨物管理六(二十四)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more