翻译-在10行代码之内创建容器化的.net core应用
本文翻译自Hans Kilian的文章
Creating a containerized .NET core application in less than 10 lines of code
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应用的更多相关文章
- 《zw版·Halcon-delphi系列原创教程》简单的令人发指,只有10行代码的车牌识别脚本
<zw版·Halcon-delphi系列原创教程>简单的令人发指,只有10行代码的车牌识别脚本 简单的令人发指,只有10行代码的车牌识别脚本 人脸识别.车牌识别是opencv当中 ...
- [Unity Editor]10行代码搞定Hierarchy排序
在日常的工作和研究中,当给我们的场景摆放过多的物件的时候,Hierarchy面板就会变得杂乱不堪.比如这样: 过多的层次结构充斥在里面,根层的物件毫无序列可言,整个层次面板显示非常的杂乱不堪,如 ...
- 10行代码搞定移动web端自定义tap事件
发发牢骚 移动web端里摸爬滚打这么久踩了不少坑,有一定移动web端经验的同学一定被click困扰过.我也不列外.一路走来被虐的不行,fastclick.touchend.iscroll什么的都用过, ...
- delphi 牛逼 了 app (已在软件界掀起波澜)10分钟10行代码做出让人惊叹的程序
(已在软件界掀起波澜)10分钟10行代码做出让人惊叹的程序 http://v.qq.com/x/page/m0328h73bs7.html?ptag=bbs_csdn_net
- 如何用Python统计《论语》中每个字的出现次数?10行代码搞定--用计算机学国学
编者按: 上学时听过山师王志民先生一场讲座,说每个人不论干什么,都应该学习国学(原谅我学了计算机专业)!王先生讲得很是吸引我这个工科男,可能比我的后来的那些同学听课还要认真些,当然一方面是兴趣.一方面 ...
- 10行代码,用python能做出什么骚操作
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小栗子 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...
- Spring Boot 中 10 行代码构建 RESTful 风格应用
RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 ...
- 示例 - 10行代码在C#中获取页面元素布局信息
最近研究一个如何在网页定位验证码并截图的问题时, 用SS写了一段C#小脚本可以轻松获取页面任意元素的布局信息 (top, left, width, height). 10行功能代码, 觉得有点用, 现 ...
- 10分钟10行代码开发APP(delphi 应用案例)
总结一下用到的知识(开发环境安装配置不计算在内): 第六章 使用不同风格的按钮: 第十七章 让布局适应不同大小与方向的窗体: 第二十五章 使用 dbExpress访问 InterBase ToGo ...
随机推荐
- vue模块化以及封装Storage组件实现保存搜索的历史记录
<template> <div id="app"> <input type="text" v-model='todo' @keyd ...
- jenkins用户和权限管理
添加用户 进入管理界面,选择manage users,添加用户 将人和角色绑定 用户和项目绑定 角色管理 可以针对不同的站点对不同的人赋权 添加角色并赋权 将角色赋权给对应的用户 使用新添加的这个用户 ...
- 【Redis】Redis 主从模式搭建
主从模式介绍 Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据 ...
- [错误处理]no matches found: connexion[swagger-ui] ?
问题原因: [ ] 中括号会影响shell脚本的执行 安装的时候在包名扩上双引号"" pip install "connexion[swagger-ui]" w ...
- Spring 定时任务 注解版
Task类: ManageSql.Java对应代码: package com.axb.cheney.task; import java.sql.ResultSet; import java.sql.S ...
- 邪淫真正的可怕危害 (转自学佛网:http://www.xuefo.net/nr/article54/544414.html)
邪淫真正的可怕危害 邪淫的害处可能很快就显现,也可能是逐渐的表现出来.但往往后者的害处更大.因为当积累了多年的邪淫果报一旦显现,后悔就已经晚了. 我本人就是一个很好的例子.回想自己这40多年的日子,邪 ...
- F5 BIG-IP – Useful SNMP oids to monitor
I have collected some of the most interesting OIDs (in my scenario im using LTM and APM modules) fro ...
- LODOP计算结果值的合计
LODOP中可以通过表达式等方式,计算结果并显示在LODOP预览打印的表格里,计算的是table中本来存在的数据,可以用tindex指定合计哪一列(相关博文:)那一列的数值是table中实际存在的,如 ...
- chrome浏览器调试JS代码
是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方法是用 console.log() 在 JavaScript 控制台上输出内容.嗯~,用这 ...
- web端自动化——selenium项目集成HTML测试报告
参考内容: 虫师:<selenium2自动化测试实战——基于python语言> PS:书中的代码,只能做参考,最好还是自己码一码,不一定照搬就全是对的,实践出真知... 随着软件不断迭代功 ...