netcore更新dll要停止_使 .NET Core 应用程序容器化
在本教程中,你將了解如何使用 Docker 容器化 .NET Core 應用。 容器具有很多特性和優點,如具有不可變的基礎結構、提供可移植的體系結構和實現可伸縮性。 此影像可用于為本地開發環境、私有云或公有云創建容器。
在本教程中,你將了解:
- 創建并發布簡單的 .NET Core 應用
- 創建并配置用于 .NET Core 的 Dockerfile
- 生成 Docker 映像
- 創建并運行 Docker 容器
你將了解用于 .NET Core 應用的 Docker 容器生成和部署任務。 Docker 平臺 使用 Docker 引擎 快速生成應用,并將應用打包為 Docker 映像 。 這些映像采用 Dockerfile 格式編寫,以供在分層容器中部署和運行。
備注
本教程不適用于 ASP.NET Core 應用 。 如果使用的是 ASP.NET Core,請參閱教程了解如何容器化 ASP.NET Core 應用程序。
先決
條件
安裝以下必備組件:
- .NET Core 3.1 SDK
如果已安裝 .NET Core,請使用 dotnet --info 命令來確定使用的是哪個 SDK。 - Docker 社區版
- Dockerfile 和 .NET Core 示例應用的臨時工作文件夾 。 在本教程中,docker-working 用作工作文件夾的名稱。
創建 .Net Core 應用
需要有可供 Docker 容器運行的 .NET Core 應用。 打開終端、創建工作文件夾(如果尚沒有),然后進入該文件夾。 在工作文件夾中,運行下面的命令,在名為“app”的子目錄中新建一個項目 :
.NET Core CLI復制
dotnet new console -o App -n NetCore.Docker文件夾樹將如下所示:
復制
docker-working └──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.cachedotnet new 命令會新建一個名為“應用”的文件夾,并生成一個“Hello World”控制臺應用程序 。 從終端會話更改目錄并導航到“App”文件夾 。 使用 dotnet run 命令啟動應用。 應用程序將運行,并在命令下方打印 Hello World!:
.NET Core CLI復制
dotnet runHello World!默認模板創建應用,此應用先打印輸出到終端,然后立即終止。 本教程將使用無限循環的應用。 在文本編輯器中,打開“Program.cs” 文件。
提示
如果使用 Visual Studio Code,則從上一個終端會話中鍵入以下命令:
復制
code .這會在 Visual Studio Code 中打開包含該項目的“App”文件夾 。
Program.cs 應如下面的 C# 代碼所示 :
C#復制
using System;namespace NetCore.Docker{ class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } }}將此文件替換為以下每秒計數一次的代碼:
C#復制
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); } } }}保存此文件,并使用 dotnet run 再次測試程序。 請注意,此應用無限期運行。 使用取消命令 Ctrl+C 可以停止運行。 下面是一個示例輸出:
.NET Core CLI復制
dotnet runCounter: 1Counter: 2Counter: 3Counter: 4^C如果你在命令行中向應用傳遞一個數字,它就只會計數到這個數字,然后退出。 試一試用 dotnet run -- 5 計數到 5。
重要
-- 之后的參數都不傳遞到 dotnet run 命令,而是傳遞到你的應用程序。
發布 .Net Core 應用
在將 .NET Core 應用添加到 Docker 映像之前,必須先發布該應用。 最好讓容器運行應用的已發布版本。 若要發布應用,請運行以下命令:
.NET Core CLI復制
dotnet publish -c Release此命令將應用編譯到“發布”文件夾中 。 從工作文件夾到“發布”文件夾的路徑應為 .AppbinReleaseetcoreapp3.1publish
- Windows
- Linux
在“應用”文件夾中獲取“發布”文件夾的目錄列表,以驗證 NetCore.Docker.dll 文件是否已創建 。
PowerShell復制
dir .binReleaseetcoreapp3.1publish Directory: C:甥敳獲dapineAppbinReleaseetcoreapp3.1publishMode LastWriteTime Length Name---- ------------- ------ -----a---- 4/27/2020 8:27 AM 434 NetCore.Docker.deps.json-a---- 4/27/2020 8:27 AM 6144 NetCore.Docker.dll-a---- 4/27/2020 8:27 AM 171520 NetCore.Docker.exe-a---- 4/27/2020 8:27 AM 860 NetCore.Docker.pdb-a---- 4/27/2020 8:27 AM 154 NetCore.Docker.runtimeconfig.json創建 Dockerfile
docker build 命令使用 Dockerfile 文件來創建容器映像。 此文件是名為“Dockerfile” 的文本文件,它沒有擴展名。
在包含 .csproj 的目錄中創建名為“Dockerfile”的文件,并在文本編輯器中將其打開 。 本教程將使用 ASP.NET Core 運行時映像(包含 .NET Core 運行時映像),并與 .NET Core 控制臺應用程序相對應。
Dockerfile復制
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1備注
盡管可能已使用 mcr.microsoft.com/dotnet/core/runtime:3.1 映像,但此處有意使用 ASP.NET Core 運行時映像。
FROM 關鍵字需要完全限定的 Docker 容器影像名稱。 Microsoft 容器注冊表(MCR,mcr.microsoft.com)是 Docker Hub 的聯合,可托管可公開訪問的容器。 dotnet/core 段是容器存儲庫,其中 aspnet 段是容器映像名稱。 該映像使用 3.1 進行標記,它用于版本控制。 因此,mcr.microsoft.com/dotnet/core/aspnet:3.1 是 .NET Core 3.1 運行時。 請確保拉取的運行時版本與 SDK 面向的運行時一致。 例如,在上一節中創建的應用使用的是 .NET Core 3.1 SDK,并且 Dockerfile 中引用的基本映像標記有 3.1 。
保存 Dockerfile 文件 。 工作文件夾的目錄結果應如下所示。 為節省本文的空間,省略了一些更深級別的文件和文件夾:
復制
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 └──...在終端中運行以下命令:
Docker復制
docker build -t counter-image -f Dockerfile .Docker 會處理 Dockerfile 中的每一行。 docker build 命令中的 . 指示 Docker 在當前文件夾中查找 Dockerfile 。 此命令生成映像,并創建指向相應映像的本地存儲庫“counter-image” 。 在此命令完成后,運行 docker images 以列出已安裝的映像:
Docker復制
docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcounter-image latest e6780479db63 4 days ago 190MBmcr.microsoft.com/dotnet/core/aspnet 3.1 e6780479db63 4 days ago 190MB請注意,兩個映像共用相同的“IMAGE ID” 值。 兩個映像使用的 ID 值相同是因為,Dockerfile 中的唯一命令是在現有映像的基礎之上生成新映像。 接下來,在 Dockerfile 中添加三個命令 。 兩個命令都新建映像層,最后一個命令表示 counter-image 存儲庫條目指向的映像 。
Dockerfile復制
COPY bin/Release/netcoreapp3.1/publish/ App/WORKDIR /AppENTRYPOINT ["dotnet", "NetCore.Docker.dll"]COPY 命令指示 Docker 將計算機上的指定文件夾復制到容器中的文件夾。 在此示例中,“publish”文件夾被復制到容器中的“App”文件夾 。
WORKDIR 命令將容器內的當前目錄更改為“App” 。
下一個命令 ENTRYPOINT 指示 Docker 將容器配置為可執行文件運行。 在容器啟動時,ENTRYPOINT 命令運行。 當此命令結束時,容器也會自動停止。
在終端中,運行 docker build -t counter-image -f Dockerfile .;在此命令完成后,運行 docker images。
Docker復制
docker build -t counter-image -f Dockerfile .Sending build context to Docker daemon 1.117MBStep 1/4 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 ---> e6780479db63Step 2/4 : COPY bin/Release/netcoreapp3.1/publish/ App/ ---> d1732740eed2Step 3/4 : WORKDIR /App ---> Running in b1701a42f3ffRemoving intermediate container b1701a42f3ff ---> 919aab5b95e3Step 4/4 : ENTRYPOINT ["dotnet", "NetCore.Docker.dll"] ---> Running in c12aebd26cedRemoving intermediate container c12aebd26ced ---> cd11c3df9b19Successfully built cd11c3df9b19Successfully tagged counter-image:latestdocker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcounter-image latest cd11c3df9b19 41 seconds ago 190MBmcr.microsoft.com/dotnet/core/aspnet 3.1 e6780479db63 4 days ago 190MBDockerfile 中的每個命令生成了一個層,并創建了“IMAGE ID” 。 最終“IMAGE ID”是“cd11c3df9b19”(你的 ID 會有所不同),接下來在此映像的基礎之上創建容器 。
創建容器
至此,已有包含應用的映像,可以創建容器了。 可以通過兩種方式來創建容器。 首先,新建已停止的容器。
Docker復制
docker create --name core-counter counter-image0f281cb3af994fba5d962cc7d482828484ea14ead6bfe386a35e5088c0058851上面的 docker create 命令在 counter-image 映像的基礎之上創建容器 。 此命令的輸出顯示已創建容器的“CONTAINER ID” (你的 ID 會有所不同)。 若要查看所有 容器的列表,請使用 docker ps -a 命令:
Docker復制
docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES0f281cb3af99 counter-image "dotnet NetCore.Dock…" 40 seconds ago Created core-counter管理容器
容器是使用特定名稱 core-counter 創建的,此名稱用于管理容器。 下面的示例使用 docker start 命令來啟動容器,然后使用 docker ps 命令僅顯示正在運行的容器:
Docker復制
docker start core-countercore-counterdocker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2f6424a7ddce counter-image "dotnet NetCore.Dock…" 2 minutes ago Up 11 seconds core-counter同樣,docker stop 命令會停止容器。 下面的示例使用 docker stop 命令來停止容器,然后使用 docker ps 命令來顯示未在運行的容器:
Docker復制
docker stop core-countercore-counterdocker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES連接到容器
在容器運行后,可以連接到它來查看輸出。 使用 docker start 和 docker attach 命令,啟動容器并查看輸出流。 在此示例中,Ctrl+C 擊鍵用于從正在運行的容器中分離出來。 除非另行指定,否則此擊鍵將結束容器中的進程,這會停止容器。 --sig-proxy=false 參數可確保 Ctrl+C 不會停止容器中的進程。
從容器中分離出來后重新連接,以驗證它是否仍在運行和計數。
Docker復制
docker start core-countercore-counterdocker attach --sig-proxy=false core-counterCounter: 7Counter: 8Counter: 9^Cdocker attach --sig-proxy=false core-counterCounter: 17Counter: 18Counter: 19^C刪除容器
就本文而言,你不希望存在不執行任何操作的容器。 刪除前面創建的容器。 如果容器正在運行,停止容器。
Docker復制
docker stop core-counter下面的示例列出了所有容器。 然后,它使用 docker rm 命令來刪除容器,并再次檢查是否有任何正在運行的容器。
Docker復制
docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2f6424a7ddce counter-image "dotnet NetCore.Dock…" 7 minutes ago Exited (143) 20 seconds ago core-counterdocker rm core-countercore-counterdocker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES單次運行
Docker 提供了 docker run 命令,用于將容器作為單一命令進行創建和運行。 使用此命令,無需依次運行 docker create 和 docker start。 另外,還可以將此命令設置為,在容器停止時自動刪除容器。 例如,使用 docker run -it --rm 可以執行兩項操作,先自動使用當前終端連接到容器,再在容器完成時刪除容器:
Docker復制
docker run -it --rm counter-imageCounter: 1Counter: 2Counter: 3Counter: 4Counter: 5^C容器還會將參數傳遞給 .NET Core 應用的執行。 指示 .NET Core 應用僅計數為 3 個傳入 3 個。
Docker復制
docker run -it --rm counter-image 3Counter: 1Counter: 2Counter: 3使用 docker run -it,Ctrl+C 命令會停止在容器中運行的進程,進而停止容器。 由于提供了 --rm 參數,因此在進程停止時自動刪除容器。 驗證它是否不存在:
Docker復制
docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES更改 ENTRYPOINT
使用 docker run 命令,還可以修改 Dockerfile 中的 ENTRYPOINT 命令,并運行其他內容,但只能針對相應容器。 例如,使用以下命令來運行 bash 或 cmd.exe。 根據需要,編輯此命令。
- Windows
- Linux
在本例中,ENTRYPOINT 更改為 cmd.exe。 通過按下 Ctrl+C 來結束進程并停止容器。
Docker復制
docker run -it --rm --entrypoint "cmd.exe" counter-imageMicrosoft Windows [Version 10.0.17763.379](c) 2018 Microsoft Corporation. All rights reserved.C:>dir Volume in drive C has no label. Volume Serial Number is 3005-1E84 Directory of C:04/09/2019 08:46 AM app03/07/2019 10:25 AM 5,510 License.txt04/02/2019 01:35 PM Program Files04/09/2019 01:06 PM Users04/02/2019 01:35 PM Windows 1 File(s) 5,510 bytes 4 Dir(s) 21,246,517,248 bytes freeC:>^C總結
以上是生活随笔為你收集整理的netcore更新dll要停止_使 .NET Core 应用程序容器化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spencer的Snaplii公司是干嘛
- 下一篇: 一打开就致命错误_CAD|致命错误|解决