Docker中部署.NET CORE应用(控制台应用程序篇)

Docker中部署.NET Core应用(控制台篇)

在本教程中,你将了解:

  • 创建并发布简单的 .NET Core 控制台应用
  • 创建并配置用于 .NET Core 的 Dockerfile
  • 生成 Docker 映像
  • 创建、运行、删除 Docker 容器

一、环境准备

1、百度云服务器

  • ​ CPU:1核。

  • ​ 内存:2GB。

  • ​ 带宽:1M。

  • ​ 操作系统:CentOS/8.2 x86_64(64bit)

2、安装以下必备组件

  • .NET Core 3.1 SDK
    如果已安装 .NET Core,请使用 dotnet --info 命令来确定使用的是哪个 SDK。
  • Docker 社区版

3、安装Docker

可参考这篇文章:https://blog.csdn.net/qq_40600379/article/details/108939632

4、安装.NET Core3.1SDK

可参考这篇文章:https://blog.csdn.net/qq_40600379/article/details/109107818

二、创建 .Net Core 应用

1、创建项目文件夹

(1)首先使用命令"cd /"进入到CentOS的根目录。

(2)使用 mkdir netcore-project 命令创建一个名为"netcore-project"的文件夹。

(3)使用 cd /netcore-project命令进入(2)中创建的文件夹。

(4)使用 20201014netcore-docker 命令创建一个名为"20201014netcore-docker"的文件夹。

cd /  
mkdir netcore-project
cd /netcore-project
mkdir 20201014netcore-docker

(5)使用"pwd"命令查看当前文件夹的路径

[root@instance-12a4py32 App]# pwd 
/netcore-project/20201014netcore-docker/App

2、使用.NET Core命令创建控制台项目

(1)在命令行中输入下面命令,表示创建一个名为"NetCore.Docker"的控制台应用程序,并放在App文件夹中。

dotnet new console -o App -n NetCore.Docker

(2)文件夹树将如下所示:

20201014netcore-docker
    └──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

(3) 使用 "cd /App"命令进入"App"目录(因为含有Main函数的.cs文件在这个目录中),再使用 dotnet run 命令启动应用,并在命令下方打印 Hello World!

cd /App
dotnet run
Hello World!

(4) 使用Vim文本编辑器打开“Program.cs” 文件,可看到.cs中的文件代码如下所示:

using System;

namespace NetCore.Docker
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

(5)将此文件替换为以下每秒计数一次的代码(注:在vim编辑器中点击键盘的"i"就进入编辑模式,点击"esc"退出编辑模式,输入":wq"表示保存并退出):

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);
            }
        }
    }
}

(6)保存此文件,并使用 dotnet run 再次测试程序。 注意,此应用无限期运行。 敲击键盘的"Ctrl+C "可以停止运行。 下面是一个示例输出:

dotnet run
Counter: 1
Counter: 2
Counter: 3
Counter: 4
^C

三、发布 .Net Core 应用

(1)在将 .NET Core 应用添加到 Docker 映像之前,必须先发布该应用,请运行以下命令:

dotnet publish -c Release

(2)此命令将应用编译到“发布”文件夹中 ,切换工作路径到发布文件夹, 路径应为 .\App\bin\Release\netcoreapp3.1\publish\

[root@instance-12a4py32 20201014netcore-docker]# cd App/bin/Release/netcoreapp3.1

(3)使用命令 ls 查看当前目录列表,并验证 NetCore.Docker.dll 文件是否已创建 。

[root@instance-12a4py32 netcoreapp3.1]# ls
NetCore.Docker  NetCore.Docker.deps.json  NetCore.Docker.dll  NetCore.Docker.pdb  NetCore.Docker.runtimeconfig.dev.json  NetCore.Docker.runtimeconfig.json  publish

四、创建 Dockerfile

1、创建Dockerfile文件

(1)在包含 .csproj 的目录中创建名为“Dockerfile”的文件,并在Vim文本编辑器中将其打开 。

(2)FROM 关键字表示限定的 Docker 容器映像名称(文本中第一段必须是以FROM开头)。

(3)Microsoft 容器注册表(MCR,mcr.microsoft.com)是 Docker Hub 的联合,可托管可公开访问的容器。

(4) dotnet/core 段是容器存储库,其中 aspnet 段是容器映像名称。 该映像使用 3.1 进行标记,它用于版本控制。 因此,mcr.microsoft.com/dotnet/core/aspnet:3.1 是 .NET Core 3.1 运行时。 请确保拉取的运行时版本与 SDK 面向的运行时一致。

(5)在编辑器中输入如下代码:

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

(6)此时目录结构如下:

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
            └──...

2、创建容器映像

(1)docker build 命令使用 Dockerfile 文件来创建容器映像。 此文件是名为“Dockerfile” 的文本文件,它没有扩展名。

(2)Docker 会处理 Dockerfile 中的每一行。

(3) docker build 命令中的 . 指示 Docker 在当前文件夹中查找 Dockerfile 。 此命令生成映像,并创建指向相应映像的本地存储库“counter-image” 。

(4)在终端中运行以下命令(注:可能会比较久,因为要拉取国外镜像):

docker build -t counter-image -f Dockerfile .

(5)在此命令完成后,运行 docker images 以列出已安装的映像:
Docker中部署.NET CORE应用(控制台应用程序篇)_第1张图片
(6)从上图可看到,两个映像共用相同的“IMAGE ID” 值。 原因是文本中只有一条命令,且该命令是基于"mcr.microsoft.com/dotnet/core/aspnet:3.1"生成新的。

3、创建“IMAGE ID” 值不同的容器映像

(1)COPY 命令指示 Docker 将计算机上的指定文件夹复制到容器中的文件夹。 在此示例中,“publish”文件夹被复制到容器中的“App”文件夹 。

(2)WORKDIR 命令将容器内的当前目录更改为“App” 。

(3)命令 ENTRYPOINT 指示 Docker 将容器配置为可执行文件运行。 在容器启动时,ENTRYPOINT 命令运行。 当此命令结束时,容器也会自动停止。

(4)在 Dockerfile 中添加如下三个命令:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
COPY bin/Release/netcoreapp3.1/publish/ App/
WORKDIR /App
ENTRYPOINT ["dotnet", "NetCore.Docker.dll"]

(5)在终端中,运行 docker build -t counter-image -f Dockerfile .;在此命令完成后,运行 docker images
Docker中部署.NET CORE应用(控制台应用程序篇)_第2张图片

五、创建容器

1、创建容器

(1)在第四步中,我们已经创建好了映像,接下来使用如下命令创建容器:

(2)下面的命令表示在counter-image映像(镜像)基础上创建一个名为"core-counter-container"容器。

(3)下面很长一串字符串表示的是容器的ID。

[root@instance-12a4py32 App]# docker create --name core-counter-container counter-image
57f4babc5dd967fe16c4d1671b18fd412df8e4cf3b162f7707b2ce1c928a23e5

(4)使用 docker ps -a 命令查看当前系统中所有容器的列表:

[root@instance-12a4py32 App]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
57f4babc5dd9        counter-image       "dotnet NetCore.Dock…"   39 seconds ago      Created                                       core-counter-container
9480e7f28609        hello-world         "/hello"                 22 hours ago        Exited (0) 22 hours ago                       admiring_swartz

2、管理容器

(1)在上一步中,我们创建了一个名为 core-counter-container 容器。 下面的示例使用 docker start 命令来启动容器,然后使用 docker ps 命令仅显示正在运行的容器:

[root@instance-12a4py32 App]# docker start core-counter-container 
core-counter-container
[root@instance-12a4py32 App]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
57f4babc5dd9        counter-image       "dotnet NetCore.Dock…"   2 minutes ago       Up 9 seconds                                  core-counter-container
9480e7f28609        hello-world         "/hello"                 22 hours ago        Exited (0) 22 hours ago                       admiring_swartz
[root@instance-12a4py32 App]# docker stop core-counter-container

(2)使用docker stop 命令停止容器。 下面的示例使用 docker stop 命令来停止容器,然后使用 docker ps 命令来显示未在运行的容器:

控制台复制

[root@instance-12a4py32 App]# docker stop core-counter-container
core-counter-container
[root@instance-12a4py32 App]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
57f4babc5dd9        counter-image       "dotnet NetCore.Dock…"   4 minutes ago       Exited (143) 10 seconds ago                       core-counter-container
9480e7f28609        hello-world         "/hello"                 23 hours ago        Exited (0) 23 hours ago                           admiring_swartz

(3)两个命令的对比如下图:
Docker中部署.NET CORE应用(控制台应用程序篇)_第3张图片

3、连接到容器

(1)在容器运行后,可以连接到它来查看输出。 使用 docker startdocker attach 命令,启动容器并查看输出流。

(2)在此示例中,Ctrl+C 击键用于从正在运行的容器中分离出来。 除非另行指定,否则此击键将结束容器中的进程,这会停止容器。 --sig-proxy=false 参数可确保 Ctrl+C 不会停止容器中的进程。

(3)从容器中分离出来后重新连接,以验证它是否仍在运行和计数。

(4)下面出现"^c"是因为敲击了键盘的"ctrl+c"。

[root@instance-12a4py32 App]# docker start core-counter-container
core-counter-container
[root@instance-12a4py32 App]# docker attach --sig-proxy=false core-counter-container
Counter: 31
Counter: 32
Counter: 33
Counter: 34
Counter: 35
Counter: 36
Counter: 37
Counter: 38
Counter: 39
Counter: 40
Counter: 41
Counter: 42
Counter: 43
Counter: 44
^C
[root@instance-12a4py32 App]# docker attach --sig-proxy=false core-counter-container
Counter: 81
Counter: 82
Counter: 83
Counter: 84
Counter: 85
Counter: 86
Counter: 87
^C

Docker中部署.NET CORE应用(控制台应用程序篇)_第4张图片

4、删除容器

(1) 首先停止正在运行的容器。

(2)使用新命令删除前面创建的"core-counter-container"容器。

docker stop core-counter-container

(3)下面"docker ps -a"列出所有容器,可看大列表中存在名为"core-counter-container" 的容器。

(4)使用 docker rm 命令来删除容器,即输入"docker rm core-counter-container"命令执行删除操作。

(5)再次使用"docker ps -a"列出所有容器,发现已经没有了名为"core-counter-container" 的容器。

[root@instance-12a4py32 App]# docker stop core-counter-container
core-counter-container
[root@instance-12a4py32 App]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
57f4babc5dd9        counter-image       "dotnet NetCore.Dock…"   8 minutes ago       Exited (143) 10 seconds ago                       core-counter-container
9480e7f28609        hello-world         "/hello"                 23 hours ago        Exited (0) 23 hours ago                           admiring_swartz


[root@instance-12a4py32 App]# docker rm core-counter-container 
core-counter-container
[root@instance-12a4py32 App]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
9480e7f28609        hello-world         "/hello"            23 hours ago        Exited (0) 23 hours ago                       admiring_swartz

六、重要命令

​ Docker 包含许多不同的命令,可用于创建、管理以及与容器和映像进行交互。 下面这些 Docker 命令对于管理容器来说至关重要:

  • docker build
  • docker run
  • docker ps
  • docker stop
  • docker rm
  • docker rmi
  • docker image

七、清理资源

在本教程中,创建了容器和映像。 如果需要,请删除这些资源。 以下命令可用于

(1)列出所有容器

docker ps -a

(2)停止正在运行的容器。

docker stop counter-image-container

(3)删除容器

docker rm counter-image-container

(4)使用 docker images 命令来列出已安装的映像。

(5)删除计算机上不再需要用到的映像。 依次删除 Dockerfile 创建的映像,以及 Dockerfile 所依据的 .NET Core 映像。 可以使用 IMAGE ID 或 REPOSITORY:TAG 格式字符串。

rm Dockerfile   //删除Dockerfile文件,注意需要回到存放该文件的目录
docker rmi counter-image:latest    //删除counter-image镜像
docker rmi mcr.microsoft.com/dotnet/core/aspnet:3.1

参考微软官方文档:https://docs.microsoft.com/zh-cn/dotnet/core/docker/build-container?tabs=linux#create-the-dockerfilehttps://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos

如果觉得有用,请点个赞哈!
如果疑问或者建议,可以留言或私信我!

你可能感兴趣的:(NETCore,Docker)