Docker中部署.NET CORE應用(控制檯應用程式篇)

菜鳥分享錄發表於2020-10-15

Docker中部署.NET Core應用(控制檯篇)

在本教程中,你將瞭解:

  • 建立併發布簡單的 .NET Core 控制檯應用
  • 建立並配置用於 .NET Core 的 Dockerfile
  • 生成 Docker 映像
  • 建立、執行、刪除 Docker 容器

一、環境準備

1、百度雲伺服器

  • ​ CPU:1核。

  • ​ 記憶體:2GB。

  • ​ 頻寬:1M。

  • ​ 作業系統:CentOS/8.2 x86_64(64bit)

2、安裝以下必備元件

3、安裝Docker

可參考這篇文章:https://blog.csdn.net/qq_40600379/article/details/108939632

4、安裝.NET Core3.1SDK

可參考這篇文章:https://blog.csdn.net/qq_40600379/article/details/109107818

二、建立 .Net Core 應用

1、建立專案資料夾

(1)首先使用命令"cd /"進入到CentOS的根目錄。

(2)使用 mkdir netcore-project 命令建立一個名為"netcore-project"的資料夾。

(3)使用 cd /netcore-project命令進入(2)中建立的資料夾。

(4)使用 20201014netcore-docker 命令建立一個名為"20201014netcore-docker"的資料夾。

cd /  
mkdir netcore-project
cd /netcore-project
mkdir 20201014netcore-docker

(5)使用"pwd"命令檢視當前資料夾的路徑

[root@instance-12a4py32 App]# pwd 
/netcore-project/20201014netcore-docker/App

2、使用.NET Core命令建立控制檯專案

(1)在命令列中輸入下面命令,表示建立一個名為"NetCore.Docker"的控制檯應用程式,並放在App資料夾中。

dotnet new console -o App -n NetCore.Docker

(2)資料夾樹將如下所示:

20201014netcore-docker
    └──App
        ├──NetCore.Docker.csproj
        ├──Program.cs
        └──obj
            ├──NetCore.Docker.csproj.nuget.dgspec.json
            ├──NetCore.Docker.csproj.nuget.g.props
            ├──NetCore.Docker.csproj.nuget.g.targets
            ├──project.assets.json
            └──project.nuget.cache

(3) 使用 "cd /App"命令進入"App"目錄(因為含有Main函式的.cs檔案在這個目錄中),再使用 dotnet run 命令啟動應用,並在命令下方列印 Hello World!

cd /App
dotnet run
Hello World!

(4) 使用Vim文字編輯器開啟“Program.cs” 檔案,可看到.cs中的檔案程式碼如下所示:

using System;

namespace NetCore.Docker
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

(5)將此檔案替換為以下每秒計數一次的程式碼(注:在vim編輯器中點選鍵盤的"i"就進入編輯模式,點選"esc"退出編輯模式,輸入":wq"表示儲存並退出):

using System;
using System.Threading.Tasks;

namespace NetCore.Docker
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var counter = 0;
            var max = args.Length != 0 ? Convert.ToInt32(args[0]) : -1;
            while (max == -1 || counter < max)
            {
                Console.WriteLine($"Counter: {++counter}");
                await Task.Delay(1000);
            }
        }
    }
}

(6)儲存此檔案,並使用 dotnet run 再次測試程式。 注意,此應用無限期執行。 敲擊鍵盤的"Ctrl+C "可以停止執行。 下面是一個示例輸出:

dotnet run
Counter: 1
Counter: 2
Counter: 3
Counter: 4
^C

三、釋出 .Net Core 應用

(1)在將 .NET Core 應用新增到 Docker 映像之前,必須先發布該應用,請執行以下命令:

dotnet publish -c Release

(2)此命令將應用編譯到“釋出”資料夾中 ,切換工作路徑到釋出資料夾, 路徑應為 .\App\bin\Release\netcoreapp3.1\publish\

[root@instance-12a4py32 20201014netcore-docker]# cd App/bin/Release/netcoreapp3.1

(3)使用命令 ls 檢視當前目錄列表,並驗證 NetCore.Docker.dll 檔案是否已建立 。

[root@instance-12a4py32 netcoreapp3.1]# ls
NetCore.Docker  NetCore.Docker.deps.json  NetCore.Docker.dll  NetCore.Docker.pdb  NetCore.Docker.runtimeconfig.dev.json  NetCore.Docker.runtimeconfig.json  publish

四、建立 Dockerfile

1、建立Dockerfile檔案

(1)在包含 .csproj 的目錄中建立名為“Dockerfile”的檔案,並在Vim文字編輯器中將其開啟 。

(2)FROM 關鍵字表示限定的 Docker 容器映像名稱(文字中第一段必須是以FROM開頭)。

(3)Microsoft 容器登錄檔(MCR,mcr.microsoft.com)是 Docker Hub 的聯合,可託管可公開訪問的容器。

(4) dotnet/core 段是容器儲存庫,其中 aspnet 段是容器映像名稱。 該映像使用 3.1 進行標記,它用於版本控制。 因此,mcr.microsoft.com/dotnet/core/aspnet:3.1 是 .NET Core 3.1 執行時。 請確保拉取的執行時版本與 SDK 面向的執行時一致。

(5)在編輯器中輸入如下程式碼:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1

(6)此時目錄結構如下:

docker-working
    └──App
        ├──Dockerfile
        ├──NetCore.Docker.csproj
        ├──Program.cs
        ├──bin
        │   └──Release
        │       └──netcoreapp3.1
        │           └──publish
        │               ├──NetCore.Docker.deps.json
        │               ├──NetCore.Docker.exe
        │               ├──NetCore.Docker.dll
        │               ├──NetCore.Docker.pdb
        │               └──NetCore.Docker.runtimeconfig.json
        └──obj
            └──...

2、建立容器映像

(1)docker build 命令使用 Dockerfile 檔案來建立容器映像。 此檔案是名為“Dockerfile” 的文字檔案,它沒有副檔名。

(2)Docker 會處理 Dockerfile 中的每一行。

(3) docker build 命令中的 . 指示 Docker 在當前資料夾中查詢 Dockerfile 。 此命令生成映像,並建立指向相應映像的本地儲存庫“counter-image” 。

(4)在終端中執行以下命令(注:可能會比較久,因為要拉取國外映象):

docker build -t counter-image -f Dockerfile .

(5)在此命令完成後,執行 docker images 以列出已安裝的映像:
在這裡插入圖片描述
(6)從上圖可看到,兩個映像共用相同的“IMAGE ID” 值。 原因是文字中只有一條命令,且該命令是基於"mcr.microsoft.com/dotnet/core/aspnet:3.1"生成新的。

3、建立“IMAGE ID” 值不同的容器映像

(1)COPY 命令指示 Docker 將計算機上的指定資料夾複製到容器中的資料夾。 在此示例中,“publish”資料夾被複制到容器中的“App”資料夾 。

(2)WORKDIR 命令將容器內的當前目錄更改為“App” 。

(3)命令 ENTRYPOINT 指示 Docker 將容器配置為可執行檔案執行。 在容器啟動時,ENTRYPOINT 命令執行。 當此命令結束時,容器也會自動停止。

(4)在 Dockerfile 中新增如下三個命令:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
COPY bin/Release/netcoreapp3.1/publish/ App/
WORKDIR /App
ENTRYPOINT ["dotnet", "NetCore.Docker.dll"]

(5)在終端中,執行 docker build -t counter-image -f Dockerfile .;在此命令完成後,執行 docker images
在這裡插入圖片描述

五、建立容器

1、建立容器

(1)在第四步中,我們已經建立好了映像,接下來使用如下命令建立容器:

(2)下面的命令表示在counter-image映像(映象)基礎上建立一個名為"core-counter-container"容器。

(3)下面很長一串字串表示的是容器的ID。

[root@instance-12a4py32 App]# docker create --name core-counter-container counter-image
57f4babc5dd967fe16c4d1671b18fd412df8e4cf3b162f7707b2ce1c928a23e5

(4)使用 docker ps -a 命令檢視當前系統中所有容器的列表:

[root@instance-12a4py32 App]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
57f4babc5dd9        counter-image       "dotnet NetCore.Dock…"   39 seconds ago      Created                                       core-counter-container
9480e7f28609        hello-world         "/hello"                 22 hours ago        Exited (0) 22 hours ago                       admiring_swartz

2、管理容器

(1)在上一步中,我們建立了一個名為 core-counter-container 容器。 下面的示例使用 docker start 命令來啟動容器,然後使用 docker ps 命令僅顯示正在執行的容器:

[root@instance-12a4py32 App]# docker start core-counter-container 
core-counter-container
[root@instance-12a4py32 App]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
57f4babc5dd9        counter-image       "dotnet NetCore.Dock…"   2 minutes ago       Up 9 seconds                                  core-counter-container
9480e7f28609        hello-world         "/hello"                 22 hours ago        Exited (0) 22 hours ago                       admiring_swartz
[root@instance-12a4py32 App]# docker stop core-counter-container

(2)使用docker stop 命令停止容器。 下面的示例使用 docker stop 命令來停止容器,然後使用 docker ps 命令來顯示未在執行的容器:

控制檯複製

[root@instance-12a4py32 App]# docker stop core-counter-container
core-counter-container
[root@instance-12a4py32 App]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
57f4babc5dd9        counter-image       "dotnet NetCore.Dock…"   4 minutes ago       Exited (143) 10 seconds ago                       core-counter-container
9480e7f28609        hello-world         "/hello"                 23 hours ago        Exited (0) 23 hours ago                           admiring_swartz

(3)兩個命令的對比如下圖:
在這裡插入圖片描述

3、連線到容器

(1)在容器執行後,可以連線到它來檢視輸出。 使用 docker startdocker attach 命令,啟動容器並檢視輸出流。

(2)在此示例中,Ctrl+C 擊鍵用於從正在執行的容器中分離出來。 除非另行指定,否則此擊鍵將結束容器中的程式,這會停止容器。 --sig-proxy=false 引數可確保 Ctrl+C 不會停止容器中的程式。

(3)從容器中分離出來後重新連線,以驗證它是否仍在執行和計數。

(4)下面出現"^c"是因為敲擊了鍵盤的"ctrl+c"。

[root@instance-12a4py32 App]# docker start core-counter-container
core-counter-container
[root@instance-12a4py32 App]# docker attach --sig-proxy=false core-counter-container
Counter: 31
Counter: 32
Counter: 33
Counter: 34
Counter: 35
Counter: 36
Counter: 37
Counter: 38
Counter: 39
Counter: 40
Counter: 41
Counter: 42
Counter: 43
Counter: 44
^C
[root@instance-12a4py32 App]# docker attach --sig-proxy=false core-counter-container
Counter: 81
Counter: 82
Counter: 83
Counter: 84
Counter: 85
Counter: 86
Counter: 87
^C

在這裡插入圖片描述

4、刪除容器

(1) 首先停止正在執行的容器。

(2)使用新命令刪除前面建立的"core-counter-container"容器。

docker stop core-counter-container

(3)下面"docker ps -a"列出所有容器,可看大列表中存在名為"core-counter-container" 的容器。

(4)使用 docker rm 命令來刪除容器,即輸入"docker rm core-counter-container"命令執行刪除操作。

(5)再次使用"docker ps -a"列出所有容器,發現已經沒有了名為"core-counter-container" 的容器。

[root@instance-12a4py32 App]# docker stop core-counter-container
core-counter-container
[root@instance-12a4py32 App]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
57f4babc5dd9        counter-image       "dotnet NetCore.Dock…"   8 minutes ago       Exited (143) 10 seconds ago                       core-counter-container
9480e7f28609        hello-world         "/hello"                 23 hours ago        Exited (0) 23 hours ago                           admiring_swartz


[root@instance-12a4py32 App]# docker rm core-counter-container 
core-counter-container
[root@instance-12a4py32 App]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
9480e7f28609        hello-world         "/hello"            23 hours ago        Exited (0) 23 hours ago                       admiring_swartz

六、重要命令

​ Docker 包含許多不同的命令,可用於建立、管理以及與容器和映像進行互動。 下面這些 Docker 命令對於管理容器來說至關重要:

七、清理資源

在本教程中,建立了容器和映像。 如果需要,請刪除這些資源。 以下命令可用於

(1)列出所有容器

docker ps -a

(2)停止正在執行的容器。

docker stop counter-image-container

(3)刪除容器

docker rm counter-image-container

(4)使用 docker images 命令來列出已安裝的映像。

(5)刪除計算機上不再需要用到的映像。 依次刪除 Dockerfile 建立的映像,以及 Dockerfile 所依據的 .NET Core 映像。 可以使用 IMAGE ID 或 REPOSITORY:TAG 格式字串。

rm Dockerfile   //刪除Dockerfile檔案,注意需要回到存放該檔案的目錄
docker rmi counter-image:latest    //刪除counter-image映象
docker rmi mcr.microsoft.com/dotnet/core/aspnet:3.1

參考微軟官方文件:https://docs.microsoft.com/zh-cn/dotnet/core/docker/build-container?tabs=linux#create-the-dockerfilehttps://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos

如果覺得有用,請點個贊哈!
如果疑問或者建議,可以留言或私信我!

相關文章