在Linux和Windows的Docker容器中运行ASP.NET Core

时间:2021-09-15 01:47:15

(此文章同时发表在本人微信公众号“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的文章地址为:

=====我是译文正文开始的分隔符=====

在去年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来进行开发。

我安装了如下东西:

ASP.NET Core with .NET Core

Docker for Windows (我使用Beta通道)

Visual Studio Tools for Docker

Docker for Windows真的非常好,它可以自动为你配置好Hyper-V,创建一个Docker宿主OS,并启动好这个虚拟机。节约了大量的时间。

在Linux和Windows的Docker容器中运行ASP.NET Core

这是我的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容器中