本文的作者是微软的Azure平台的工程师,去年年底微软就宣布开源.Net核心运行时,并与Mono合作以推进.Net在Linux等非Windows 平台的移植。同时,微软也宣布将在新一代的Windows服务器上支持Docker,支持容器化部署,这让我们看到了微软拥抱开源的决心。本文介绍了如何 在Linux中使用Docker容器部署基于ASP.NET 5的应用程序。
作为ASP.NET 5跨平台部署实现的一部分,我们正在为简化ASP.NET应用部署、兼容Linux或者Mac OS X等操作系统运行而努力工作。最近,我们发布了首个ASP.NET的Docker镜像: ASP.NET 5预览版Docker镜像。
Docker是一个开源的项目,目的是在Linux操作系统下轻松的以沙箱 的方式运行应用程序。当你下载了ASP.NET 5的Docker镜像,你就有了一个能够运行ASP.NET 5应用程序的Linux环境;现在你所要做的仅仅是在这个镜像中添加你的应用程序,然后启动一个容器,运行它,发布它。
本教程中我们为你展示如何在微软Azure云上利用Docker在Linux操作系统中部署一个使用ASP.NET 5预览版编写的简单的Web应用程序。这个教程中的例子可以在Linux、Mac OS X或者所有能装Docker客户端的操作系统下运行(如果喜欢,你也可以远程登录Linux虚拟机运行)。当然,当你安装了Docker的Windows 客户端,你就能在Windows上运行本文中的例子。以后,如果Window Server支持容器化部署了,你就能使用Docker在Windows Server中来管理Windows Server的容器了。
注:文中所有的演示流程与代码都是基于ASP.NET 5(vNext)预览版的,在正式发布后运行的方式可能会有所不同。所以,到时候如果读者需要知道如何使用Docker部署ASP.NET 5的应用程序,还请自行登陆ASP.NET 5的 Docker Hub页面或者 GitHub仓库去参看最新的部署文档。
现在Docker还只能在Linux上运行,所以你必须找一台Linux机器或者装了Linux虚拟机的机器来运行Docker;你在 这里可以找到Docker的安装步骤或者通过参考这篇文章 Getting Started with Docker On Azure(在Azure云端安装Docker的起步教程)。当然你可以从Azure云获取一个安装好Docker的Linux虚拟运行环境。
这个教程假设你已经在Azure上有了安装好Docker的Linux虚拟机。如果你拥有其它类似的运行环境,那这个教程也是可以使用的。
为了能让ASP.NET应用程序在云端部署,你需要一个Docker镜像来承载你的应用。
Docker镜像的文件系统是层叠式的(AUFS文件系统),可以这样形象的理解:你的应用程序只是“基础镜像”上层新加的一个层而已(译者注:就像盖房子一样,新增的楼层是基于它下面的楼层建立起来的),而在我们的例子中“基础镜像”为 microsoft/aspnet(译 者注:这是一个Docker镜像的名称,这个镜像存在于Docker Hub中)。在Docker中镜像的层级是增量叠加起来的(译者注:这点跟Git原理一样),Docker保存了每个层之间的差异,所以当我们用 Docker部署应用时,提交的更新不会包含Linux发行版内核或者ASP.NET的运行时,因为这些都已经存在于“基础镜像”中了,你只会提交基于此 “基础镜像”构建的应用程序本身,所以Docker的这种差异化提交、部署机制能够确保应用程序以最快速、最小化的增量方式进行部署,为运维带来极大的便 利。
如何创建Docker镜像呢?答案是使用:Dockerfile。跟Makefile相似,Dockerfile包含了供Docker用来构建一个镜像的所有步骤。
本教程所用到的ASP.NET源代码可以从GitHub的 aspnet/Home仓库下的 HelloWeb目录提取。首先,使用如下命令将源代码从GitHub上克隆下来:
1 |
git clon<b>e</b> git@github.<a name="qihoosnap3"></a><b>com</b>:aspn<b>e</b>t/Hom<b>e</b>.git aspn<b>e</b>t-Hom<b>e</b> |
切换到aspnet-Home的sample目录下:
1 |
cd aspn<b>e</b>t-Hom<b>e</b>/sampl<b>e</b>s/H<b>e</b>lloW<b>e</b>b |
完成后目录结构应该如下所示:
1 2 3 |
├── Startup.cs ├── imag<b>e</b>.jpg └── proj<b>e</b>ct.json |
然后我们在此目录下创建一个名叫Dockerfile的文件,并输入如下指令:
1 2 3 4 5 6 |
FROM microsoft/aspn<b>e</b>t COPY . /app WORKDIR /app RUN ["kpm", "r<b>e</b>stor<b>e</b>"] <b>E</b>XPOS<b>E</b> 5004 ENTRYPOINT ["k", "k<b>e</b>str<b>e</b>l"] |
让我们逐条解释此Dockerfile中命令的含义:
当我们编写完Dockerfile后,当前目录应该是如下结构,Dockerfile和程序源代码在一起:
1 2 3 4 |
├── Dock<b>e</b>rfil<b>e</b> ├── Startup.cs ├── imag<b>e</b>.jpg └── proj<b>e</b>ct.json |
现在我们来创建此Docker镜像。这个过程非常简单--运行Docker的build命令即可,命令如下:
1 |
dock<b>e</b>r build -t myapp . |
这条命令运行结束后Docker就生成了一个名为myapp的镜像;同时,你对镜像所做的任何变化都能通过重新运行此命令来生成一个新的镜像。在你的Linux虚拟机或者开发环境中运行docker images命令可以看到我们刚刚创建的myapp镜像了:
1 2 3 4 |
$ dock<b>e</b>r imag<b>e</b>s R<b>E</b>PO<a name="qihoosnap0"></a><b>SIT</b>ORY TAG IMAG<b>E</b> ID CR<b>E</b>AT<b>E</b>D VIRTUAL SIZ<b>E</b> myapp lat<b>e</b>st ccb7994d2bc1 39 s<b>e</b>conds ago 499.8 MB microsoft/aspn<b>e</b>t lat<b>e</b>st 16b1838c0b34 12 days ago 473.4 MB |
你可以看到你的应用镜像以及ASP.NET镜像都存在于你的主机上。
现在我们开始讲如何将ASP.NET应用程序部署到云端。
运行一个容器非常的简单,通过运行以下命令可以在你的开发机上启动myapp容器:
1 |
dock<b>e</b>r run -t -d -p 80:5004 myapp |
1 2 3 |
$ dock<b>e</b>r ps CONTAIN<b>E</b>R ID IMAG<b>E</b> <b>COM</b>MAND CR<b>E</b>AT<b>E</b>D STATUS PORTS NAM<b>E</b>S f70bd9ffbc36 myapp:lat<b>e</b>st "/bin/sh -c 'k k<b>e</b>str About a minut<b>e</b> ago Up About a minut<b>e</b> 0.0.0.0:80->5004/tcp mad_goodall |
看!我们已经在Linux中使用Docker容器运行ASP.NET 5的应用程序了!(译注:屌炸了!)
当然,如果你要构建一个比我们演示程序更复杂的业务系统,你需要学会编写Dockerfile来构建更加复杂的镜像,你可以参考 这里。
我们会持续为ASP.NET 5能更好的运行在Linux的Docker容器中而不断的努力、投入;同时,我们很高兴为你带来微软在Docker Hub上的首个官方镜像: ASP.NET 5 Preview Image.
当然,本教程依赖预览版的ASP.NET 5与预览版的Docker镜像,所以随着时间与开发进度的推进,本文的指令可能会过时。所以读者可以通过登录 Docker Hub或者 GitHub仓库来获取最新的镜像与程序版本。
你也可以在 GitHub上给我们反馈,以帮助我们改善Docker镜像与ASP.NET 5。
原文链接:Running ASP.NET 5 applications in Linux Containers with Docker(翻译:肖劲 审校:李颖杰)