netcore更新dll要停止_使 .NET Core 应用程序容器化
在本教程中,你將了解如何使用 Docker 容器化 .NET Core 應(yīng)用。 容器具有很多特性和優(yōu)點(diǎn),如具有不可變的基礎(chǔ)結(jié)構(gòu)、提供可移植的體系結(jié)構(gòu)和實(shí)現(xiàn)可伸縮性。 此影像可用于為本地開發(fā)環(huán)境、私有云或公有云創(chuàng)建容器。
在本教程中,你將了解:
- 創(chuàng)建并發(fā)布簡單的 .NET Core 應(yīng)用
- 創(chuàng)建并配置用于 .NET Core 的 Dockerfile
- 生成 Docker 映像
- 創(chuàng)建并運(yùn)行 Docker 容器
你將了解用于 .NET Core 應(yīng)用的 Docker 容器生成和部署任務(wù)。 Docker 平臺(tái) 使用 Docker 引擎 快速生成應(yīng)用,并將應(yīng)用打包為 Docker 映像 。 這些映像采用 Dockerfile 格式編寫,以供在分層容器中部署和運(yùn)行。
備注
本教程不適用于 ASP.NET Core 應(yīng)用 。 如果使用的是 ASP.NET Core,請參閱教程了解如何容器化 ASP.NET Core 應(yīng)用程序。
先決
條件
安裝以下必備組件:
- .NET Core 3.1 SDK
如果已安裝 .NET Core,請使用 dotnet --info 命令來確定使用的是哪個(gè) SDK。 - Docker 社區(qū)版
- Dockerfile 和 .NET Core 示例應(yīng)用的臨時(shí)工作文件夾 。 在本教程中,docker-working 用作工作文件夾的名稱。
創(chuàng)建 .Net Core 應(yīng)用
需要有可供 Docker 容器運(yùn)行的 .NET Core 應(yīng)用。 打開終端、創(chuàng)建工作文件夾(如果尚沒有),然后進(jìn)入該文件夾。 在工作文件夾中,運(yùn)行下面的命令,在名為“app”的子目錄中新建一個(gè)項(xiàng)目 :
.NET Core CLI復(fù)制
dotnet new console -o App -n NetCore.Docker文件夾樹將如下所示:
復(fù)制
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 命令會(huì)新建一個(gè)名為“應(yīng)用”的文件夾,并生成一個(gè)“Hello World”控制臺(tái)應(yīng)用程序 。 從終端會(huì)話更改目錄并導(dǎo)航到“App”文件夾 。 使用 dotnet run 命令啟動(dòng)應(yīng)用。 應(yīng)用程序?qū)⑦\(yùn)行,并在命令下方打印 Hello World!:
.NET Core CLI復(fù)制
dotnet runHello World!默認(rèn)模板創(chuàng)建應(yīng)用,此應(yīng)用先打印輸出到終端,然后立即終止。 本教程將使用無限循環(huán)的應(yīng)用。 在文本編輯器中,打開“Program.cs” 文件。
提示
如果使用 Visual Studio Code,則從上一個(gè)終端會(huì)話中鍵入以下命令:
復(fù)制
code .這會(huì)在 Visual Studio Code 中打開包含該項(xiàng)目的“App”文件夾 。
Program.cs 應(yīng)如下面的 C# 代碼所示 :
C#復(fù)制
using System;namespace NetCore.Docker{ class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } }}將此文件替換為以下每秒計(jì)數(shù)一次的代碼:
C#復(fù)制
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 再次測試程序。 請注意,此應(yīng)用無限期運(yùn)行。 使用取消命令 Ctrl+C 可以停止運(yùn)行。 下面是一個(gè)示例輸出:
.NET Core CLI復(fù)制
dotnet runCounter: 1Counter: 2Counter: 3Counter: 4^C如果你在命令行中向應(yīng)用傳遞一個(gè)數(shù)字,它就只會(huì)計(jì)數(shù)到這個(gè)數(shù)字,然后退出。 試一試用 dotnet run -- 5 計(jì)數(shù)到 5。
重要
-- 之后的參數(shù)都不傳遞到 dotnet run 命令,而是傳遞到你的應(yīng)用程序。
發(fā)布 .Net Core 應(yīng)用
在將 .NET Core 應(yīng)用添加到 Docker 映像之前,必須先發(fā)布該應(yīng)用。 最好讓容器運(yùn)行應(yīng)用的已發(fā)布版本。 若要發(fā)布應(yīng)用,請運(yùn)行以下命令:
.NET Core CLI復(fù)制
dotnet publish -c Release此命令將應(yīng)用編譯到“發(fā)布”文件夾中 。 從工作文件夾到“發(fā)布”文件夾的路徑應(yīng)為 .AppbinReleaseetcoreapp3.1publish
- Windows
- Linux
在“應(yīng)用”文件夾中獲取“發(fā)布”文件夾的目錄列表,以驗(yàn)證 NetCore.Docker.dll 文件是否已創(chuàng)建 。
PowerShell復(fù)制
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創(chuàng)建 Dockerfile
docker build 命令使用 Dockerfile 文件來創(chuàng)建容器映像。 此文件是名為“Dockerfile” 的文本文件,它沒有擴(kuò)展名。
在包含 .csproj 的目錄中創(chuàng)建名為“Dockerfile”的文件,并在文本編輯器中將其打開 。 本教程將使用 ASP.NET Core 運(yùn)行時(shí)映像(包含 .NET Core 運(yùn)行時(shí)映像),并與 .NET Core 控制臺(tái)應(yīng)用程序相對(duì)應(yīng)。
Dockerfile復(fù)制
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1備注
盡管可能已使用 mcr.microsoft.com/dotnet/core/runtime:3.1 映像,但此處有意使用 ASP.NET Core 運(yùn)行時(shí)映像。
FROM 關(guān)鍵字需要完全限定的 Docker 容器影像名稱。 Microsoft 容器注冊表(MCR,mcr.microsoft.com)是 Docker Hub 的聯(lián)合,可托管可公開訪問的容器。 dotnet/core 段是容器存儲(chǔ)庫,其中 aspnet 段是容器映像名稱。 該映像使用 3.1 進(jìn)行標(biāo)記,它用于版本控制。 因此,mcr.microsoft.com/dotnet/core/aspnet:3.1 是 .NET Core 3.1 運(yùn)行時(shí)。 請確保拉取的運(yùn)行時(shí)版本與 SDK 面向的運(yùn)行時(shí)一致。 例如,在上一節(jié)中創(chuàng)建的應(yīng)用使用的是 .NET Core 3.1 SDK,并且 Dockerfile 中引用的基本映像標(biāo)記有 3.1 。
保存 Dockerfile 文件 。 工作文件夾的目錄結(jié)果應(yīng)如下所示。 為節(jié)省本文的空間,省略了一些更深級(jí)別的文件和文件夾:
復(fù)制
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 └──...在終端中運(yùn)行以下命令:
Docker復(fù)制
docker build -t counter-image -f Dockerfile .Docker 會(huì)處理 Dockerfile 中的每一行。 docker build 命令中的 . 指示 Docker 在當(dāng)前文件夾中查找 Dockerfile 。 此命令生成映像,并創(chuàng)建指向相應(yīng)映像的本地存儲(chǔ)庫“counter-image” 。 在此命令完成后,運(yùn)行 docker images 以列出已安裝的映像:
Docker復(fù)制
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請注意,兩個(gè)映像共用相同的“IMAGE ID” 值。 兩個(gè)映像使用的 ID 值相同是因?yàn)?#xff0c;Dockerfile 中的唯一命令是在現(xiàn)有映像的基礎(chǔ)之上生成新映像。 接下來,在 Dockerfile 中添加三個(gè)命令 。 兩個(gè)命令都新建映像層,最后一個(gè)命令表示 counter-image 存儲(chǔ)庫條目指向的映像 。
Dockerfile復(fù)制
COPY bin/Release/netcoreapp3.1/publish/ App/WORKDIR /AppENTRYPOINT ["dotnet", "NetCore.Docker.dll"]COPY 命令指示 Docker 將計(jì)算機(jī)上的指定文件夾復(fù)制到容器中的文件夾。 在此示例中,“publish”文件夾被復(fù)制到容器中的“App”文件夾 。
WORKDIR 命令將容器內(nèi)的當(dāng)前目錄更改為“App” 。
下一個(gè)命令 ENTRYPOINT 指示 Docker 將容器配置為可執(zhí)行文件運(yùn)行。 在容器啟動(dòng)時(shí),ENTRYPOINT 命令運(yùn)行。 當(dāng)此命令結(jié)束時(shí),容器也會(huì)自動(dòng)停止。
在終端中,運(yùn)行 docker build -t counter-image -f Dockerfile .;在此命令完成后,運(yùn)行 docker images。
Docker復(fù)制
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 中的每個(gè)命令生成了一個(gè)層,并創(chuàng)建了“IMAGE ID” 。 最終“IMAGE ID”是“cd11c3df9b19”(你的 ID 會(huì)有所不同),接下來在此映像的基礎(chǔ)之上創(chuàng)建容器 。
創(chuàng)建容器
至此,已有包含應(yīng)用的映像,可以創(chuàng)建容器了。 可以通過兩種方式來創(chuàng)建容器。 首先,新建已停止的容器。
Docker復(fù)制
docker create --name core-counter counter-image0f281cb3af994fba5d962cc7d482828484ea14ead6bfe386a35e5088c0058851上面的 docker create 命令在 counter-image 映像的基礎(chǔ)之上創(chuàng)建容器 。 此命令的輸出顯示已創(chuàng)建容器的“CONTAINER ID” (你的 ID 會(huì)有所不同)。 若要查看所有 容器的列表,請使用 docker ps -a 命令:
Docker復(fù)制
docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES0f281cb3af99 counter-image "dotnet NetCore.Dock…" 40 seconds ago Created core-counter管理容器
容器是使用特定名稱 core-counter 創(chuàng)建的,此名稱用于管理容器。 下面的示例使用 docker start 命令來啟動(dòng)容器,然后使用 docker ps 命令僅顯示正在運(yùn)行的容器:
Docker復(fù)制
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 命令會(huì)停止容器。 下面的示例使用 docker stop 命令來停止容器,然后使用 docker ps 命令來顯示未在運(yùn)行的容器:
Docker復(fù)制
docker stop core-countercore-counterdocker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES連接到容器
在容器運(yùn)行后,可以連接到它來查看輸出。 使用 docker start 和 docker attach 命令,啟動(dòng)容器并查看輸出流。 在此示例中,Ctrl+C 擊鍵用于從正在運(yùn)行的容器中分離出來。 除非另行指定,否則此擊鍵將結(jié)束容器中的進(jìn)程,這會(huì)停止容器。 --sig-proxy=false 參數(shù)可確保 Ctrl+C 不會(huì)停止容器中的進(jìn)程。
從容器中分離出來后重新連接,以驗(yàn)證它是否仍在運(yùn)行和計(jì)數(shù)。
Docker復(fù)制
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刪除容器
就本文而言,你不希望存在不執(zhí)行任何操作的容器。 刪除前面創(chuàng)建的容器。 如果容器正在運(yùn)行,停止容器。
Docker復(fù)制
docker stop core-counter下面的示例列出了所有容器。 然后,它使用 docker rm 命令來刪除容器,并再次檢查是否有任何正在運(yùn)行的容器。
Docker復(fù)制
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單次運(yùn)行
Docker 提供了 docker run 命令,用于將容器作為單一命令進(jìn)行創(chuàng)建和運(yùn)行。 使用此命令,無需依次運(yùn)行 docker create 和 docker start。 另外,還可以將此命令設(shè)置為,在容器停止時(shí)自動(dòng)刪除容器。 例如,使用 docker run -it --rm 可以執(zhí)行兩項(xiàng)操作,先自動(dòng)使用當(dāng)前終端連接到容器,再在容器完成時(shí)刪除容器:
Docker復(fù)制
docker run -it --rm counter-imageCounter: 1Counter: 2Counter: 3Counter: 4Counter: 5^C容器還會(huì)將參數(shù)傳遞給 .NET Core 應(yīng)用的執(zhí)行。 指示 .NET Core 應(yīng)用僅計(jì)數(shù)為 3 個(gè)傳入 3 個(gè)。
Docker復(fù)制
docker run -it --rm counter-image 3Counter: 1Counter: 2Counter: 3使用 docker run -it,Ctrl+C 命令會(huì)停止在容器中運(yùn)行的進(jìn)程,進(jìn)而停止容器。 由于提供了 --rm 參數(shù),因此在進(jìn)程停止時(shí)自動(dòng)刪除容器。 驗(yàn)證它是否不存在:
Docker復(fù)制
docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES更改 ENTRYPOINT
使用 docker run 命令,還可以修改 Dockerfile 中的 ENTRYPOINT 命令,并運(yùn)行其他內(nèi)容,但只能針對(duì)相應(yīng)容器。 例如,使用以下命令來運(yùn)行 bash 或 cmd.exe。 根據(jù)需要,編輯此命令。
- Windows
- Linux
在本例中,ENTRYPOINT 更改為 cmd.exe。 通過按下 Ctrl+C 來結(jié)束進(jìn)程并停止容器。
Docker復(fù)制
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總結(jié)
以上是生活随笔為你收集整理的netcore更新dll要停止_使 .NET Core 应用程序容器化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spencer的Snaplii公司是干嘛
- 下一篇: 一打开就致命错误_CAD|致命错误|解决