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 以列出已安装的映像:

(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

五、创建容器

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)两个命令的对比如下图:

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

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

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

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

  1. docker 中部署一个springBoot项目

    docker 中部署一个springBoot项目 (1)介绍 springBoot项目 1.项目结构 2.pom.xml [java] view plaincopy <?xml version= ...

  2. Docker中部署Mysql8数据库

    场景 Docker中部署mysql数据库: Docker中部署mysql数据库_BADAO_LIUMANG_QIZHI的博客-CSDN博客 上面安装过mysql5.7,下面介绍安装Mysql8. 注: ...

  3. Docker中部署mysql后SpringBoot连接时提示表不存在(修改表名忽略大小写)

    场景 Docker中部署mysql数据库: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99213563 在上面使用Docker ...

  4. Docker中部署项目到容器

    场景 使用Dockerfile定制镜像来部署Tomcat项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99105626 D ...

  5. 如果在docker中部署tomcat,并且部署java应用程序

    2019独角兽企业重金招聘Python工程师标准>>> 如果在docker中部署tomcat,并且部署java应用程序 博客分类: docker 1.先说如何在docker中部署to ...

  6. docker 发布tomcat项目_在docker中部署tomcat并且部署java应用程序的步骤详解

    1.先说如何在docker中部署tomcat 第一步:root用户登录在系统根目录下创建文件夹tomcat7,命令如:mkdir tomcat7,并且切换到该目录下:cd tomcat7: 第二步:创 ...

  7. java none怎么用tomcat_在docker中部署tomcat并且部署java应用程序的步骤详解

    先给大家简单说下Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是 ...

  8. django开发-在Docker中部署django项目

    今天整理了一下如何在docker中部署django项目. 1.环境如下: python3.6 django2.0.5 nginx mysql5.7 gunicorn 2.项目结构如下: 由于仅仅是测试 ...

  9. 【FATE】==在Docker中部署FATE——单机版==

    目录 1. 环境准备 2. Docker安装 3. Docker-Compose安装 4. 检查本地8080.9360.9380端口是否被占用 5. 在Docker中部署FATE 6. 测试 1. 环 ...

  10. 7条命令在docker中部署Mesos集群

    7条命令在docker中部署Mesos集群 所有使用的Docker容器构建文件是有也.您可以在本地构建每个容器或只使用位于Docker Hub预构建的容器.下面的命令会自动下载所需的预建的容器为您服务 ...

最新文章

  1. symfony2项目访问app_dev.php不显示debug工具栏的问题
  2. 北科院分子互作实战专题培训班(10月底/11月底班)(生物医药与营养健康协同创新中心)...
  3. 文本编辑器实现跳转到指定行的功能
  4. 5.深度学习练习:Deep Neural Network for Image Classification: Application
  5. p20怎么用android auto,奔驰23P/P20驾驶辅助系统到底有哪些功能,怎么使用?
  6. 开源GIS(十七)——OGC标准
  7. windows10中如何在d盘新建kaoshi.log文件_命令行备份Windows 10驱动amp;设备管理器中安装驱动。...
  8. 推荐三个不错的开源项目
  9. 多关键字排序的c语言编程,常见排序——“计数排序(三关键字)”的源程序(C语言版)...
  10. 分布式搜索Elasticsearch增、删、改、查操作深入详解
  11. Kinect开发教程八:OpenNI2显示深度、彩色及融合图像
  12. 数能一体化物联网感知层路由协议研究
  13. ffmpeg和JavaCV
  14. 系统篇-在linux上用deb包安装steam。
  15. 美国小学计算机编程课程,美国小学STEM课程案例研究
  16. 如何让mysql数据库支持超大图片
  17. LR2021下载LR2021最新10.1.0下载安装Lightroom最新下载1分钟看完就能自己操作
  18. 聊聊程序员与英语,程序员不学英语行吗?
  19. android第三方播放器--饺子播放器的使用
  20. 7-11 到底是不是太胖了(10 分)

热门文章

  1. OAuth2 vs JWT,到底怎么选?
  2. ArcGIS教程:MapGIS向ArcGIS数据格式转换方法
  3. STM32 4*4矩阵键盘实现原理(附程序)
  4. ios刺客信条一直显示连接服务器,刺客信条本色iOS进不去怎么办
  5. 总结了一份嵌入式相关开源项目、库、资料
  6. 一键清理windows系统垃圾|临时文件bat脚本
  7. 【大牛分享】人机工程简史
  8. Spring Boot + Vue 开发的物流管理系统,附源码
  9. 大学计算机网络实训目的,计算机专业大学生毕业实习目的
  10. python仿360界面_高仿360界面的实现(用纯XML和脚本实现)