译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,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.1ENTRYPOINT ["dotnet", "WebApplication4.dll"]ARG source=.WORKDIR /appEXPOSE 80COPY $source .

接下来,由于我不希望Docker编译我的应用程序,只想发布到本地。可以阅读Steve Laske的博客文章"Building Optimized Docker Images with ASP.NET Core"来了解如何在一个容器中构建应用程序而在其他容器中运行。这样做优化了服务器的使用率和资源。

我将通过如下命令行指令来发布、构建镜像并运行它。

>dotnet publish

>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonlinux 

>docker imagesREPOSITORY             TAG                 IMAGE ID            CREATED             SIZEaspnetcoreonlinux      latest              dab2bff7e4a6        28 seconds ago      276.2 MBmicrosoft/aspnetcore   1.0.1               2e781d03cb22        44 hours ago        266.7 MB

>docker run -it -d -p 85:80 aspnetcoreonlinux1cfcc8e8e7d4e6257995f8b64505ce25ae80e05fe1962d4312b2e2fe33420413

>docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES1cfcc8e8e7d4        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容器间切换。

那么现在我就来用用Windows容器的Docker。你可能还不知道你已经拥有Windows容器了!它已经和Windows 10周年更版本一起发布了。你可以在Windows特性对话框中启用容器功能:

我将修改一下Dockerfile来使用Windows Nano Server镜像。我也可以在Docker内部通过环境变量和Expose命令来控制ASP.NET暴露的端口。

FROM microsoft/dotnet:nanoserverENTRYPOINT ["dotnet", "WebApplication4.dll"]ARG source=.WORKDIR /appENV ASPNETCORE_URLS http://+:82EXPOSE 82COPY $source .

接着,我发布并构建……

>dotnet publish>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonnano 

然后,运行它,映射Windows外部端口到Windows容器内部!

注意:在Windows 10通过“NAT”(网络地址转换)来和容器通讯的时候,有一个Bug,你不能如你(我)所愿的那样,直接通过 http://localhost:82 来访问容器应用。你不得不通过容器本身的IP来访问。一旦听到这个Bug的更多消息和被修复的情况,我会及时公布在这里。它应该会通过Windows Update在几天内出现。从Docker得到容器的IP地址的方法为:docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" HASH

那么,我将通过如下命令在Windows Nano Server中运行我的ASP.NET Core应用(再次说明一下,它将运行在Windows 10的Nano Server容器内)。

>docker run -it -d -p 88:82 aspnetcoreonnanoafafdbead8b04205841a81d974545f033dcc9ba7f761ff7e6cc0ec8f3ecce215

>docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" afa172.16.240.197

现在,我可以通过172.16.240.197:82来访问这个站点。一旦上面的Bug被修复后,我们就能像其他容器那样访问它了。

Windows容器的最美好的一面就是它非常快和轻量级。一旦镜像被下载下来,在机器上构建好,那么你通过Docker来启动和停止它们都是秒完成。

不过,你也可以通过如下命令来使用Docker隔离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:

FROM microsoft/dotnet:1.0.0-preview2-windowsservercore-sdkENTRYPOINT ["dotnet", "WebApplication4.dll"]ARG source=.WORKDIR /appENV ASPNETCORE_URLS http://+:82EXPOSE 82COPY $source .

注意:我听说使用Windows Sever Core的.NET Core镜像有可能会取消。因为让.NET Core运行在Windows Nano Server或其他轻量级镜像中更有意义。你应该把Sever Core用于那些更加笨重的应用。如果你真的需要运行在Sever Core的.NET Core,你可以制作自己的Dockerfile来轻易构建你所要的镜像。

接下来,我将再次发布、构建和运行。

>docker imagesREPOSITORY             TAG                                    IMAGE ID            CREATED             SIZEaspnetcoreonnano       latest                                 7e02d6800acf        24 minutes ago      1.113 GBaspnetcoreonservercore latest                                 a11d9a9ba0c2        28 minutes ago      7.751 GB

由于容器能够非常快的启动和停止,所以我可以利用跑在容器中的Redis、一个SQL容器和包含其他部分的第三个容器来跑一个完整的Web集群。或者混合并配对。

>docker psCONTAINER ID        IMAGE                 COMMAND                  PORTS                NAMESd32a981ceabb        aspnetcoreonwindows   "dotnet WebApplicatio"   0.0.0.0:87->82/tcp   compassionate_blackwella179a48ca9f6        aspnetcoreonnano      "dotnet WebApplicatio"   0.0.0.0:86->82/tcp   determined_stallman170a8afa1b8b        aspnetcoreonnano      "dotnet WebApplicatio"   0.0.0.0:89->82/tcp   agitated_northcuttafafdbead8b0        aspnetcoreonnano      "dotnet WebApplicatio"   0.0.0.0:88->82/tcp   naughty_ramanujan2cf45ea2f008        a7fa77b6f1d4          "dotnet WebApplicatio"   0.0.0.0:97->82/tcp   sleepy_hodgkin

总结

再次,让我们阅读Michae的另外一篇文章,他使用Docker Compose来把ASP.NET Music Store示例跑在一个Windows容器中,而SQL Express跑在另外一个中,以及Steve Lasker的博客文章(实际上他的整篇文章都是金矿)中提到的为ASP.NET Core制作一个优化的Docker镜像。

IMAGE ID            RESPOSITORY                   TAG                 SIZE0ec4274c5571        web                          optimized           276.2 MBf9f196304c95        web                          single              583.8 MBf450043e0a44        microsoft/aspnetcore         1.0.1               266.7 MB706045865622        microsoft/aspnetcore-build   1.0.1               896.6 MB

Steve提到了大量的技巧,让你可以解决Docker和ASP.NET Core在一起的大部分问题。

所有的一切意味着(IMHO),你可以把ASP.NET Core用在:

  • 在Linux中跑ASP.NET Core

    • 在Docker容器里面

    • 在任何云平台中

  • 在Windows,、Windows Server、Server Core和Nano Server中跑ASP.NET Core

    • 在Docker的Windows容器里面

    • 在Docker的Hyper-V隔离容器里面

这意味着你可以选择任意特性支持和为服务器使用率和便捷度优化过的尺寸大小。一旦所有的工具(Docker for Windows和Visual Studio Docker Tools)准备妥当,我们就能拥有良好的调试环境,和从开发到生产的工作流支持。

你在使用Docker、容器和ASP.NET Core进行开发了吗?希望在评论中看到你们的声音。

内容转载自公众号

dotNET每日精华文章
了解更多

在Linux和Windows的Docker容器中运行ASP.NET Core相关推荐

  1. 在docker中运行ASP.NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

  2. 如何在Docker容器中运行GUI程序

    如何在Docker容器中运行GUI程序 各位,今天我们将学习如何在Docker之中运行GUI程序.我们可以轻易地在Docker容器中运行大多数GUI程序且不出错.Docker是一个开源项目,提供了一个 ...

  3. 如何在Docker容器中运行Docker [3种方法]

    在本博客中,我将向您介绍在docker中运行docker所需的三种不同方法. Docker In Docker的用处 dockerIndocker的一个潜在用处是CI管道,在代码成功构建后,您需要在其 ...

  4. vs附加其它计算机应用到进程,如何将VS代码附加到在docker容器中运行的节点进程...

    我试图将Visual Studio代码调试程序附加到在Docker容器中运行的node.js应用程序. 我启动应用程序,如: node --debug-brk app.js 我在docker-comp ...

  5. Docker 容器中运行 Docker 命令

    Docker 容器中运行 Docker 命令 在使用 GitLab/Jenkins 等 CI 软件的时候需要使用 Docker 命令来构建镜像,需要在容器中使用 Docker 命令:通过将宿主机的 D ...

  6. 【Rust日报】 2019-05-27:toast - 支持在docker容器中运行任务的工具

    Rust中文社区翻译小组招募 #activity #RustChina 首批任务:Rust官网翻译 这里有详细说明 https://github.com/rust-lang/www.rust-lang ...

  7. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  8. Beats:如何在 Docker 容器中运行 Filebeat

    今天在这篇博客中,我们将学习如何在容器环境中运行 Filebeat. 为了快速了解 Filebeat 是做什么用的: Filebeat用于转发和集中日志数据 它重量轻,小型化,使用的资源更少 它作为代 ...

  9. 在Docker容器中运行程序时出错,You have to remove (or rename) that container to be able to reuse that name

    1.docker run 命令来在容器内运行一个应用程序,出现以下问题 [root@localhost ~]# docker run --name runoob-nginx-test -p 8081: ...

最新文章

  1. tcp接口测试工具_你不了解的,完整“接口测试”与服务虚拟化
  2. 【Sqoop学习之一】Sqoop简介
  3. 2018-2019 20165226 Exp9 Web安全基础
  4. 第二十七期:Deepfake视频正在快速传播,也许区块链能够阻止这波“瘟疫”
  5. DataTable新增列设置DefaultValue问题。
  6. 程序导致IIS服务器应用程序池停止
  7. 《spring-boot学习》-10-RabbitMQ
  8. Exchange Reporter Plus概述
  9. metinfo小于v6.2.0版本SQL盲注利用脚本
  10. centos7安装samba服务,以及设置权限分配
  11. 名字打架小游戏 java_闲暇极品MD5 能用名字打架的小游戏
  12. 串口调试助手、网络调试助手
  13. 【渝粤题库】陕西师范大学164109人力资源管理 作业(高起专)
  14. go :Multiple-value strconv.Atoi() (int, error) in single-value context
  15. MobSF分析.ipa文件,MobSF分析iOS app
  16. python计算机视觉-图像处理基础章节第三章之根据仿射或单应性变换实现图像的扭曲,映射,融合
  17. 易基因|Science:宏基因组测序揭示病原菌介导植物内生菌群抑病功能激活
  18. 浅谈手机内存不够的解决方法--我的手机是红米note5
  19. 11.28计算机导论课后总结
  20. 你真的会在阳光下拍照片么?

热门文章

  1. 使用Ext.grid.Panel显示远程数据
  2. NDK/JNI01--NDK下载配置
  3. 右击硬盘分区第一项出现Auto的解决办法
  4. C#中的表达式和运算符
  5. 如何获取 Process.Start 打开进程的输出结果?
  6. Layui宣布下线,不自禁的感叹一下,回忆啊
  7. Minimal API Todo Sample
  8. ML.NET Cookbook:(5)如何查看中间过程数据?
  9. NET问答: Find() 和 Where().FirstOrDefault() 该如何选择 ?
  10. . NET5一出,. NET岗面试普遍喊难,真相是…