翻译-在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 ...
随机推荐
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- FrameLayout--霓虹灯
主函数里面,新建一个线程,控制改变背景色 package com.example.framelayout import android.support.v7.app.AppCompatActivity ...
- Flutter异步编程 http网络请求数据
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as ht ...
- logrotate机制&原理
logrotate机制&原理 centos系统中默认安装logrotate,logrotate主配置文件:/etc/logrotate.conf,其中定义了系统默认的logrotate规则,当 ...
- .NET Core入门程序
易百教程 https://www.yiibai.com/dotnet_core/dotnet_core_getting_started.html
- 逐层解析请求json参数字符串【我】
import net.sf.json.JSONObject; 逐层解析请求json参数字符串: InputStream inStream =null; BufferedReader br =null; ...
- SVL-VI SLAM
3.4. Mappoints management and key frame process如果在步骤3.3中成功跟踪地图点,则缓存地图点以在下一帧中优先化.当完成当前帧的跟踪时,应该为下一帧更新帧 ...
- 泡泡一分钟:Aided Inertial Navigation: Unified Feature Representations and Observability Analysis
http://udel.edu/~yuyang/downloads/tr_observabilityII.pdf Aided Inertial Navigation: Unified Feature R ...
- Python3入门(十三)——连接数据库
以Mysql为例: 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection: 连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结 ...
- matlab优化函数fminunc
一起来学演化计算-matlab优化函数fminunc 觉得有用的话,欢迎一起讨论相互学习~Follow Me fminunc 求无约束多变量函数的最小值 非线性编程求解器 找到指定问题的最小值,\(m ...