在本教程中,你将了解:
CPU:1核。
内存:2GB。
带宽:1M。
操作系统:CentOS/8.2 x86_64(64bit)
dotnet --info
命令来确定使用的是哪个 SDK。可参考这篇文章:https://blog.csdn.net/qq_40600379/article/details/108939632
可参考这篇文章:https://blog.csdn.net/qq_40600379/article/details/109107818
(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
(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
(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
(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
└──...
(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
以列出已安装的映像:
(6)从上图可看到,两个映像共用相同的“IMAGE ID” 值。 原因是文本中只有一条命令,且该命令是基于"mcr.microsoft.com/dotnet/core/aspnet:3.1"生成新的。
(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
。
(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
(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
(1)在容器运行后,可以连接到它来查看输出。 使用 docker start
和 docker 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
(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 命令对于管理容器来说至关重要:
在本教程中,创建了容器和映像。 如果需要,请删除这些资源。 以下命令可用于
(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
如果觉得有用,请点个赞哈!
如果疑问或者建议,可以留言或私信我!