1. 程式人生 > >Docker系列之.NET Core入門(三)

Docker系列之.NET Core入門(三)

前言

在Docker生態系統中除了上一節所講解的基本概念,還有其他專業術語,本文我們將一筆帶過,同時會開始陸續進入到在.NET Core中使用Docker。

專業術語

Docker Engine(Docker引擎):客戶端 - 伺服器應用程式。 Docker公司將Docker Engine分為兩個產品。 Docker Community Edition(CE)基於開源工具且免費,我們學習時可以使用這款產品。 Docker Enterprise附帶了其他功能支援,比如管理和安全等等功能。

Docker Client(Docker客戶端):我們與Docker進行互動的主要方式。 使用Docker命令列介面(CLI)時,在終端中鍵入以docker開頭的命令,Docker Client會使用Docker API將命令傳送到Docker守護程序中。

Docker Daemon(Docker守護程序):監聽Docker API請求的Docker伺服器。 Docker守護程序主要管理映象,容器,網路和卷。

Docker Volumes(Docker卷):儲存建立應用程式和執行應用程式持久化資料的最佳方式。

Docker Registry:儲存Docker映象的遠端註冊位置。 我們將映象推送到登錄檔並從登錄檔中提取影象,我們可以託管自己的登錄檔或使用供應商商的登錄檔。

Docker Hub:Docker映象的最大登錄檔。 它也是Dcoker預設的登錄檔位置, 我們可以在Docker Hub上找到免費的映象並存儲我們自己的影象。

Docker Networking:允許我們將Docker容器連線在一起。 連線的Docker容器可以位於同一主機或多個主機上。

Docker Compose:屬於一個工具,我們可以非常輕鬆地執行需要多個Docker容器的應用程式。 Docker Compose允許我們將命令寫到docker-compose.yml檔案中以供重用。 Docker Compose命令列介面(cli)使我們可以更輕鬆地與多容器應用程式進行互動。 Docker Compose免費安裝Docker。

Docker Swarm:容器部署編排的產品。Docker官方教程進行容器編排和部署使用的Docker Swarm。 建議不要浪費時間在Docker Swarm上,推薦使用Kubernetes(k8s)。

Docker Services:分散式應用程式的不同部分。 服務實際上只是“生產中的容器”。服務只執行一個映象,但它編碼了映象的執行方式 - 它應該使用哪些埠,容器應該執行多少個副本,以便服務具有所需的容量等等。 擴充套件服務會更改執行該軟體的容器例項的數量,從而為流程中的服務分配更多計算資源。Docker服務允許我們跨多個Docker守護程序擴充套件容器,並使Docker Swarms成為可能。

回顧容器

Docker映象在構建時被建立,而Dokcer容器在執行時被建立。Dockerfile是Docker的核心,Dockerfile告訴Docker如何構建映象從而被用來製作容器,每個Docker映象都包含一個名為Dockerfile但沒有副檔名的檔案。當呼叫docker build以建立映像時,假定Dockerfile位於當前工作目錄中,可以使用檔案標誌(-f)指定到其他位置,容器是由一系列層所構建,而且每個映象層只讀,除了位於其他映象層之上的最終容器映象層。 Dockerfile告訴Docker要新增哪些層以及新增它們的順序,每個映象層實際上只是一個包含自上一層以來的所更改的檔案。 在linux中,幾乎所有東西都是檔案。基礎映象提供初始層,基礎映象也稱為父映象,將映象從遠端儲存庫提取到本地時,僅僅只下載本地計算機上尚未存在的層, Docker通過重用現有層來節省空間和時間。

Dockerfile指令是一行開頭的大寫單詞,後緊跟其引數,Dockerfile中的每一行都可以包含一條指令。 構建影象時,將從上到下處理指令,如下:

只有FROM,RUN,COPY和ADD指令才能在最終映象中建立映象層,其他指令只是作為配置或說明,比如新增元資料或告訴Docker在執行時執行某些操作,例如公開埠或執行命令。在本文中,我們使用基於linux的Docker映象,當然我們也可以使用基於Windows的映象,建議使用linux。接下來我們來過濾下Dockerfile中各個指令說明。

Dockerfile指令

FROM - 指定基礎(父)映象。

LABEL - 提供元資料,包含維護者資訊。

ENV - 設定持久化環境變數。

RUN - 執行命令並建立映象層,用於將包安裝到容器中。

COPY - 將檔案和目錄複製到容器中。

ADD - 將檔案和目錄複製到容器中。 可以upack本地.tar檔案。

CMD - 為執行容器提供命令和引數,可以覆蓋引數,只能有一個CMD。

WORKDIR - 設定後續說明的工作目錄。

ARG - 定義一個在構建時傳遞給Docker的變數。

ENTRYPOINT - 為正在執行的容器提供命令和引數。 

EXPOSE - 對外暴露埠。

VOLUME - 建立目錄用於訪問和儲存持久化資料。

.NET Core入門例子 

接下來我們以.NET Core中使用Docker並輸出Hello World結束本文。

我們通過命令建立一個.NET Core控制檯程式,接下來為了在頁面上輸出Hello World,我們需要使用中介軟體,所以我們新增AspNetCore包,如下:

然後我們開啟控制檯程式,新增中介軟體列印Hello World程式碼:

    public class Startup
    {
        public void Configure(IApplicationBuilder applicationBuilder, IHostingEnvironment hostingEnvironment)
        {
            applicationBuilder.Run(async context =>
              {
                  await context.Response.WriteAsync("Hello World");
              });
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            WebHost.CreateDefaultBuilder()
           .UseStartup<Startup>()
           .UseKestrel()
           .UseUrls("http://0.0.0.0:5050")
           .Build()
           .Run();
        }
    }

程式已就緒完畢,接下來我們釋出該控制檯程式,如下:

接下來將執行上述步驟生成的bin目錄(實際上只需拷貝釋出後生成的publish目錄即可,為了省事,我直接拷貝了整個bin目錄)拷貝到ubuntu中(由於我對linux不熟悉,所以採用虛擬機器載入桌面端ubuntu映象的方式,對於從未使用過linux的童鞋,推薦使用桌面端ubuntu,友好的GUI介面,方便我們初學知道各個資料夾是做什麼的,一看便知,後續再使用服務端版的ubuntu就會得心應手啦)。 

 

接下來我們進入HelloWorld檔案目錄,建立Dockerfile檔案從而來建立.NET Core映象。

然後我們來編寫Dockerfile檔案構建映象,如下:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime

COPY ./bin/Debug/netcoreapp2.2/linux-x64/publish/ ./

ENTRYPOINT ["dotnet", "HelloWorld.dll"]

父映象為.NET Core 2.2版本和我們建立的程式版本一致,然後將我們的應用程式(即publish目錄)拷貝,最後指定程式執行的命令和引數。有了Dockerfile檔案,那麼我們就可以開始構建映象了,終端繼續執行如下命令(注意:映象標籤名稱必須全部為小寫,否則報錯):

docker build . -t hellowrold

映象已構建完畢,接下來則是建立並啟動容器執行程式,如下:

docker run -p 5050:5050 hellowrold

從上述我們可看到容器已正常啟動,且執行環境為生產環境,監聽埠為5050。桌面版ubuntu預設為我們安裝了火狐瀏覽器,此時我們開啟瀏覽器將會輸出Hello World,如下:

總結 

本文我們介紹Docker中的一些術語,然後最後寫了一個在.NET Core中使用Docker的入門例子,非常簡單。若直接使用服務端版本的ubuntu我是一臉懵逼,有了介面,我也大概知道了一些資料夾裡存放的是什麼,一目瞭然,雖說這還只是冰山一角,每天積累一點,日積月累,厚積薄發嘛不是。