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

 

posted @ 2020-08-24 18:38  yetsen  阅读(302)  评论(0编辑  收藏  举报