(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。) 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了。那么我就来翻译一下这篇文章,让更多的中文读者看到。当然Scott遇到的坑我也遇到了。
不过首先,对于不熟悉的朋友我还是来解释一下Linux容器和Windows容器的概念。
由于容器成为虚拟化和应用托管的一种不可避免的选项,Windows也开始为公众提供容器功能(其实微软具备和使用容器技术很久了)。这样的容器功能在内部的引擎通过两种方式来实现,内核级别(仅Windows Server 2016支持)和Hyper-v级别(Windows 10和Windows Server 2016支持)。但是对外的接口和标准又遵循Docker的,这样的好处是Windows容器生态可以和现有的Linux容器生态很好的结合。所以Windows容器称之为Docker on Windows。Windows容器的出现为传统的Windows服务端应用程序的容器化开启了新天地,比如把Qlik Sense的服务器放到容器中来即时编排集群。
而之前Docker公司也针对Windows 10推出过利用Hyper-V来跑一个Linux虚拟机作为容器宿主主机的发行版本。那个称之为Docker for Windows。
所以在Windows 10上,你可以同时安装Docker for Windows和Docker on Windows,只是不能同时运行两者。两者默认的安装目录不同,但是客户端(即Docker.exe)是同名的,所以我把on版本的客户端执行文件改了个名字就可以两个一起用了。其实客户端虽然版本不同,但是基本的命令还是都是兼容的,用其中一个就够了。因为Docker Deamon在两者中都是同样的访问地址。
Scott Hanselman的文章地址为:http://www.hanselman.com/blog/ExploringASPNETCoreWithDockerInBothLinuxAndWindowsContainers.aspx
=====我是译文正文开始的分隔符=====
在去年5月的时候,使用ASP.NET和Docker来折腾一些事情还步履蹒跚。不过,伟大之处就是我们一直在进步。我曾经就写过一篇博客文章来展示如何把ASP.NET 5(当时还称之为5呢,现在已经改名为Core 1.0了)应用发布到Docker中。后来,在2015年11月,类似Docker Toolbox和Kitematic这样的新工具让事情变得更加容易。在2016年5月Docker for Windows Beta继续让这件事情易如反掌。
那么来到2016年10月这个时候,我们来看看如何使用ASP.NET Core、Docker和Windows来进行开发。
我安装了如下东西:
Visual Studio Community 2015
Visual Studio 2015 Update 3
ASP.NET Core with .NET Core
.NET Core 1.0.1 - VS 2015 Tooling Preview 2
Docker for Windows (我使用Beta通道)
Visual Studio Tools for Docker
Docker for Windows真的非常好,它可以自动为你配置好Hyper-V,创建一个Docker宿主OS,并启动好这个虚拟机。节约了大量的时间。
这是我的Linux宿主,我无需太多关心它的情况。我将会通过命令行或Visual Studio来完成所有事情。
首先通过File | New Project来创建一个运行在.NET Core中的ASP.NET Core应用程序。
接着在项目名称上点击右键并选择Add | Docker Support。这一菜单来自Visual Studio Tools for Docker扩展。这个步骤会添加基本的Dockerfile和其他docker-compose文件。通过这样的开箱即用的步骤,我就完成了所有的配置从而能够把ASP.NET Core应用程序部署到Docker Linux容器中。 ASP.NET Core运行在Docker Linux容器中
从我这个ASP.NET Core应用当中,我们可以看到其使用的基础镜像(就是Dockerfile中的FROM语句)是Linux的ASP.NET Core镜像。
FROM microsoft/aspnetcore:1.0.1
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
EXPOSE 80
COPY $source .
接下来,由于我不希望Docker编译我的应用程序,只想发布到本地。可以阅读Steve Laske的博客文章"Building Optimized Docker Images with ASP.NET Core"来了解如何在一个容器中构建应用程序而在其他容器中运行。这样做优化了服务器的使用率和资源。
我将通过如下命令行指令来发布、构建镜像并运行它。
>dotnet publish
>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonlinux
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonlinux latest dab2bff7e4a6 28 seconds ago 276.2 MB
microsoft/aspnetcore 1.0.1 2e781d03cb22 44 hours ago 266.7 MB
>docker run -it -d -p 85:80 aspnetcoreonlinux
1cfcc8e8e7d4e6257995f8b64505ce25ae80e05fe1962d4312b2e2fe33420413
>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cfcc8e8e7d4 aspnetcoreonlinux "dotnet WebApplicatio" 2 seconds ago Up 1 seconds 0.0.0.0:85->80/tcp clever_archimedes
到此,我的ASP.NET Core应用就可以运行在Docker中了。我们现在已经尝试了一个Docker容器,它是托管在Windows中通过Hyper-V来运行的Linux宿主中。
我们还可以做点别的什么呢?
ASP.NET Core运行在一个运行着Windows Nano Server的Docker Windows容器中
有这样一种Windows Server,称之为Windows Server Core,它删除了UI相关的东西;有这样一种Windows Server,称之为Windows Nano Server,它让Windows缩减到只有几百M而不是几G。这意味着从所需功能和服务器使用率的角度看,这是一个非常好的选择,让你部署的空间占用尽可能的小。
让我来看一下我是否能把ASP.NET Core通过Kestrel【译者注:ASP.NET Core的跨平台Web服务器实现】运行到Windows Nano Server中。当然,由于Nano功能强大,我也能在这个容器中运行IIS,这里有文档说明。
来自Docker公司的Michael Friis有一篇很棒的博客文章描述了在Windows Server容器中构建和运行Docker应用。在安装了最新版的Docker for Windows之后,你就可以通过上下文菜单来在Linux和Windows容器间切换。
docker run --isolation=hyperv -it -d -p 86:82 aspnetcoreonnano
如此一来,实例完全是通过Hyper-v本身来隔离运行的。你可以获得世界上最好的东西:速度、方便的部署加上可选且便捷的隔离。
ASP.NET Core运行在一个运行着Windows Server Core的Docker Windows容器中
接下来,我把Dockerfile修改为使用完整的Windows Server Core镜像。在下载安装这个镜像后,其占用大约8G的空间,需要花一点时间来下载和解压,不过它确实是真正的Windows。你也可以选择运行为一个容器或者隔离的Hyper-V容器。
这里,我通过修改FROM语句来使用包含了.NET Core的Windows Sever Core:
注意:我听说使用Windows Sever Core的.NET Core镜像有可能会取消。因为让.NET Core运行在Windows Nano Server或其他轻量级镜像中更有意义。你应该把Sever Core用于那些更加笨重的应用。如果你真的需要运行在Sever Core的.NET Core,你可以制作自己的Dockerfile来轻易构建你所要的镜像。
接下来,我将再次发布、构建和运行。
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonnano latest 7e02d6800acf 24 minutes ago 1.113 GB
aspnetcoreonservercore latest a11d9a9ba0c2 28 minutes ago 7.751 GB
由于容器能够非常快的启动和停止,所以我可以利用跑在容器中的Redis、一个SQL容器和包含其他部分的第三个容器来跑一个完整的Web集群。或者混合并配对。
这意味着你可以选择任意特性支持和为服务器使用率和便捷度优化过的尺寸大小。一旦所有的工具(Docker for Windows和Visual Studio Docker Tools)准备妥当,我们就能拥有良好的调试环境,和从开发到生产的工作流支持。
你在使用Docker、容器和ASP.NET Core进行开发了吗?希望在评论中看到你们的声音。