1. 程式人生 > 實用技巧 >使 .NET Core 應用程式容器化

使 .NET Core 應用程式容器化

1. 建立併發佈一個控制檯應用,假設目錄結構如下

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.cache

2. 在工程目錄下建立Dockerfile 檔案,內容如下

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

對控制檯應用,其實用mcr.microsoft.com/dotnet/core/runtime:3.1更合適

3. 生成映像。在工程目錄下執行

docker build -t counter-image -f Dockerfile .

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

在此命令完成後,執行docker images

以列出已安裝的映像:

docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
counter-image                           latest              e6780479db63        4 days ago          190MB
mcr.microsoft.com/dotnet/core/aspnet    3.1                 e6780479db63        4 days ago          190MB

兩個映像共用相同的“IMAGE ID” 值。兩個映像使用的 ID 值相同是因為,Dockerfile 中的唯一命令是在現有映像的基礎之上生成新映像。

接下來,在 Dockerfile 中新增三個命令 。兩個命令都新建映像層,最後一個命令表示 counter-image 儲存庫條目指向的映像 。

COPY bin/Release/netcoreapp3.1/publish/ App/
WORKDIR /App
ENTRYPOINT ["dotnet", "NetCore.Docker.dll"]

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

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

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

再次執行

docker build -t counter-image -f Dockerfile .

此時會生成新的映像如下

docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
counter-image                           latest              cd11c3df9b19        41 seconds ago      190MB
mcr.microsoft.com/dotnet/core/aspnet    3.1                 e6780479db63        4 days ago          190MB

可以看到生成了不同的映像ID

4.至此,已有包含應用的映像,可以建立容器了。

docker create --name core-counter counter-image

若要檢視所有 容器的列表,請使用docker ps -a命令:

docker ps -a
CONTAINER ID    IMAGE            COMMAND                   CREATED           STATUS     PORTS    NAMES
0f281cb3af99    counter-image    "dotnet NetCore.Dock…"    40 seconds ago    Created             core-counter

使用docker start命令來啟動容器

docker start core-counter

然後使用docker ps命令僅顯示正在執行的容器:

docker ps
CONTAINER ID    IMAGE            COMMAND                   CREATED          STATUS          PORTS    NAMES
2f6424a7ddce    counter-image    "dotnet NetCore.Dock…"    2 minutes ago    Up 11 seconds            core-counter

5.在容器執行後,可以連線到它來檢視輸出。使用docker attach命令,檢視輸出流。

docker attach --sig-proxy=false core-counter

--sig-proxy=false引數可確保Ctrl+C不會停止容器中的程序。

6.docker stop用來停止容器,docker rm命令來刪除容器

docker rm core-counter

7. 刪除容器後才能刪除映像

docker rmi counter-image:latest

單次執行

Docker 提供了docker run命令,用於將容器作為單一命令進行建立和執行。使用此命令,無需依次執行docker createdocker start另外,還可以將此命令設定為,在容器停止時自動刪除容器。例如,使用docker run -it --rm可以執行兩項操作,先自動使用當前終端連線到容器,再在容器完成時刪除容器:(實測無法刪除容器)

docker run -it --rm counter-image
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
^C

使用docker run -itCtrl+C命令會停止在容器中執行的程序,進而停止容器。

使用docker run命令,還可以修改 Dockerfile 中的ENTRYPOINT命令,並執行其他內容,但只能針對相應容器。

docker run -it --rm --entrypoint "bash" counter-image
root@b735b9799abf:/App# ls
NetCore.Docker.deps.json  NetCore.Docker.dll  NetCore.Docker.exe  NetCore.Docker.pdb  NetCore.Docker.runtimeconfig.json
root@b735b9799abf:/App# dotnet NetCore.Docker.dll 3
Counter: 1
Counter: 2
Counter: 3
root@b735b9799abf:/App# exit
exit