本文翻译自Hans Kilian的文章

Creating a containerized .NET core application in less than 10 lines of code

https://medium.com/@hkkilian/creating-a-containerized-net-core-application-in-less-than-10-lines-of-code-567f4572ef01

Docker的一个优势是你可以在别人的容器之上创建你自己的容器。在这片文章我将向你展示怎么快速得创建一个包含.net core应用的docker容器。

我们需要的仅仅只是一台安装了docker的机器,并且能连接上internet。

创建一个目录并且在该目录中创建一个文件“Dockerfile”。打开那个文件,粘贴一下的代码行,并且保存。

FROM microsoft/dotnet:2.1-sdk AS build-env
WORKDIR /app
RUN dotnet new razor
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.1-aspnetcore-runtime-alpine
WORKDIR /app
COPY --from=build-env /app/out ./
ENTRYPOINT ["dotnet", "app.dll"]

在终端中执行命令 “docker build -t myapp .”

这行命令从当前目录的Dockerfile文件创建了一个docker镜像并且给这个镜像取了一个名字叫做“myapp”的标签。

然后我们就可以通过输入命令“docker run -d -p 80:80 myapp”运行这个容器化的应用了。

然后当你打开你的浏览器并且导航到http://localhost/你将看到下面显示的屏幕:

这是怎么运行的呢?

上边的那个Dockerfile指定了多级构建,包含有两个部分,每个部分四行。第一部分为要运行的应用生成并编译了源码,第二部分把编译好的应用打包进一个我们能运行的容器中。多级构建在docker17.05中才开始有介绍,因此如果你要使用该特性的话你需要17.05或者更新的docker版本。

  • 第一行指出了我们将基于微软提供的.NET core 2.1 SDK来构建我们想要的docker镜像。我们给.NET core 2.1 SDK取个别名“build-env”,这在后边会用到。
  • 第二行中我们创建了一个工作目录“/app”。
  • 第三行中我们在上边创建的目录中执行命令“dotnet new razor”,这行命令使用Razor pages创建了一个基本的asp.net应用程序所需要的所有的源代码。
  • 第四行中我们发布上边的应用到“out”目录。全路径是“/app/out”。“publish”命令足够智能,它可以在发布之前自动还原所需要的Nuget包并且进行编译。

Dockerfile中的最后四行将发布了的应用程序打包进一个只包含.net core运行时环境的docker镜像中。当我们运行这个应用的时候完全没有必要包含整个的sdk。我们想要运行的镜像越小越好。

第一行我们首先指定我们想要开始构建一个跟上一个不一样的docker镜像。这次我们将会使用基于包含了ASP.NET core运行时环境的Alpine linux分支开始构建。Alpine是一个非常小的linux发行版本,并且被广泛地使用与docker基础镜像中。

然后我们再次创建了一个工作目录“/app”,这跟第一次创建的“/app”不是同一个目录,因为我们现在正在构建一个新的docker镜像。

然后我们从第一个创建的镜像中复制应用的文件。“--from=build-env”选项指定了我们想要的是从第一个创建的镜像中复制。我们从第一个创建的镜像中复制了所有的“/app/out”目录下的文件到当前的目录/app

然后我们指定了容器的运行入口是dotnet 命令并且还要跟上参数“app.dll”。

当我们运行这个镜像的时候,我们指定了几个运行参数。第一个参数“-d”指定了该镜像应该在后台运行。第二个参数“-p 80:80”指定了容器中的80端口应该被映射到运行容器的机器的80端口上。如果你机器上的80端口被占用了,你可以使用其他端口进行映射。比如你想映射到运行docker的机器的8080端口,你可以使用“-p 8080:80”,然后你可以通过“http://localhost:8080/”访问该应用。不管你映射到机器上的哪个端口,应用程序表现出来的是不变的,就像它一直使用的是80端口一样。

你可以使用docker命令“docker ps”查看当前运行的docker镜像。

你也可以使用“docker kill <name>”停止容器。

从这里我们将要进一步学习些什么?

当然了这不是一个有用的示例。为了让示例更加接近实际,你可以很容易地改变这个例子去容器化一个自定义的c#工程项目。假设你有一个子目录“code”,其中含有你的项目源码,你可以替换“RUN dotnet new razor” 为“COPY ./code/ ./”,仅仅就改变这一行,你就可以构建你自定义的项目。或者你还可以从使用“git clone”命令从git上拉取项目。

在docker容器中构建你的解决方案的另外一个好处是你不需要担心你电脑上安装的sdk的版本冲突。如果你想尝试NET core 2.2 preview,你可以很简单地使用下边的代码来使用2.2 的SDK和2.2的 ASP.NET 运行时环境:

FROM microsoft/dotnet:2.2.100-preview3-sdk AS build-env
WORKDIR /app
RUN dotnet new razor
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.2.0-preview3-aspnetcore-runtime-alpine
WORKDIR /app
COPY --from=build-env /app/out ./
ENTRYPOINT [“dotnet”, “app.dll”]

如果你不喜欢这样的结果(2.2 preview现在似乎没有2.1好用),你不需要卸载任何的2.2的preview SDK,因为你的机器上从来没有安装过它。2.2 SDK仅仅只是安装在docker镜像之中的,仅仅只是下载下来并没有运行,除非你要求运行该镜像的时候。

如果你想查看其他的合适的.NET Docker镜像,你可以从这里开始https://hub.docker.com/r/microsoft/dotnet/

我希望这篇文章可以鼓励你尝试使用docker或者.NET core,如果你从来没有尝试过的话。添加一个类似PostgreSQL 数据库将会非常简单,因为这里已经有构建好的合适的docker镜像可以使用,你根本不需要任何的定制化。当你有多个需要相互之间进行通信的容器的时候,docker-compose是一个很棒的工具,它可以使用一个简单的命令加速并接管控制多个容器。

翻译-在10行代码之内创建容器化的.net core应用的更多相关文章

  1. 《zw版·Halcon-delphi系列原创教程》简单的令人发指,只有10行代码的车牌识别脚本

    <zw版·Halcon-delphi系列原创教程>简单的令人发指,只有10行代码的车牌识别脚本 简单的令人发指,只有10行代码的车牌识别脚本      人脸识别.车牌识别是opencv当中 ...

  2. [Unity Editor]10行代码搞定Hierarchy排序

    在日常的工作和研究中,当给我们的场景摆放过多的物件的时候,Hierarchy面板就会变得杂乱不堪.比如这样:    过多的层次结构充斥在里面,根层的物件毫无序列可言,整个层次面板显示非常的杂乱不堪,如 ...

  3. 10行代码搞定移动web端自定义tap事件

    发发牢骚 移动web端里摸爬滚打这么久踩了不少坑,有一定移动web端经验的同学一定被click困扰过.我也不列外.一路走来被虐的不行,fastclick.touchend.iscroll什么的都用过, ...

  4. delphi 牛逼 了 app (已在软件界掀起波澜)10分钟10行代码做出让人惊叹的程序

    (已在软件界掀起波澜)10分钟10行代码做出让人惊叹的程序 http://v.qq.com/x/page/m0328h73bs7.html?ptag=bbs_csdn_net

  5. 如何用Python统计《论语》中每个字的出现次数?10行代码搞定--用计算机学国学

    编者按: 上学时听过山师王志民先生一场讲座,说每个人不论干什么,都应该学习国学(原谅我学了计算机专业)!王先生讲得很是吸引我这个工科男,可能比我的后来的那些同学听课还要认真些,当然一方面是兴趣.一方面 ...

  6. 10行代码,用python能做出什么骚操作

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小栗子 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  7. Spring Boot 中 10 行代码构建 RESTful 风格应用

    RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 ...

  8. 示例 - 10行代码在C#中获取页面元素布局信息

    最近研究一个如何在网页定位验证码并截图的问题时, 用SS写了一段C#小脚本可以轻松获取页面任意元素的布局信息 (top, left, width, height). 10行功能代码, 觉得有点用, 现 ...

  9. 10分钟10行代码开发APP(delphi 应用案例)

    总结一下用到的知识(开发环境安装配置不计算在内): 第六章  使用不同风格的按钮: 第十七章  让布局适应不同大小与方向的窗体: 第二十五章 使用 dbExpress访问 InterBase ToGo ...

随机推荐

  1. jvm 命令使用调优 通过jstat、jmap对java程序进行性能调优

    转载:http://blog.csdn.net/jerry024/article/details/8507589 转载: https://blog.csdn.net/zhaozheng7758/art ...

  2. 【转】Django继承AbstractUser新建User Model时出现auth.User.groups: (fields.E304)错误

    错误详情如下: (venv) D:\workspace\music>python manage.py makemigrations SystemCheckError: System check ...

  3. win10更新之后vmware使用失败

    1.现象 2.解决:把所有更新卸载

  4. k8s记录-dockerfile

    FROM 代表基于哪个镜像 RUN 安装软件使用 MAINTAINER 镜像的创建者 CMD 容器启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD EN ...

  5. k8s记录-etcd集群部署(三)

    https://blog.csdn.net/fy_long/article/details/86542872 1)程序准备tar xvf etcd-v3.3.11-linux-amd64.tar.gz ...

  6. 增强篇6 CMOD增强删除

    CMOD实施了一个增强,但是不需要了,怎么删除呢? 要删除PPCO0005 这个增强,进入编辑状态,发现没有删除按钮,  把PPCO0005 这项删除掉 敲回车,厉害了,他又回来了,所以在这里是没法删 ...

  7. Spring Cloud API网关服务 5.2

    为什么需要API网关 通过前面内容的学习,我们已经可以构建一个简单的微服务架构系统.这个系统可以使用Spring Boot实现微服务的开发,使用Spring Cloud Eureka实现注册中心以及服 ...

  8. 基于jsplumb插件制作可拖拽、保存流程图、重绘保存后的流程图总结

    1.重点参考博文 https://blog.csdn.net/j_bean/article/details/78092647 2.关键点总结 1)实现可视区域图形画满后,拖动整个画布的效果 a.最好不 ...

  9. Python常见的异常

    Python中常见的异常如表所示. exception的更多用法: 1.通常else 语句只有在没有异常的情况下才会被执行 try: aa = "异常测试:" print(aa)e ...

  10. Exchanger实现线程间数据交换

    package com.duchong.concurrent; import java.util.ArrayList; import java.util.List; import java.util. ...