使 .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 create
和docker start
。另外,還可以將此命令設定為,在容器停止時自動刪除容器。例如,使用docker run -it --rm
可以執行兩項操作,先自動使用當前終端連線到容器,再在容器完成時刪除容器:(實測無法刪除容器)
docker run -it --rm counter-image Counter: 1 Counter: 2 Counter: 3 Counter: 4 Counter: 5 ^C
使用docker run -it
,Ctrl+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