十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇内容主要讲解“怎么在Linux和Windows的Docker容器中运行ASP.NET Core”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Linux和Windows的Docker容器中运行ASP.NET Core”吧!
成都创新互联长期为上1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为淮南企业提供专业的网站设计、网站建设,淮南网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
我安装了如下东西:
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应用当中,我们可以看到其使用的基础镜像(就是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宿主中。
我们还可以做点别的什么呢?
有这样一种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:nanoserver
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $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 aspnetcoreonnano
afafdbead8b04205841a81d974545f033dcc9ba7f761ff7e6cc0ec8f3ecce215
>docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" afa
172.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本身来隔离运行的。你可以获得世界上最好的东西:速度、方便的部署加上可选且便捷的隔离。
接下来,我把Dockerfile修改为使用完整的Windows Server Core镜像。在下载安装这个镜像后,其占用大约8G的空间,需要花一点时间来下载和解压,不过它确实是真正的Windows。你也可以选择运行为一个容器或者隔离的Hyper-V容器。
这里,我通过修改FROM语句来使用包含了.NET Core的Windows Sever Core:
FROM microsoft/dotnet:1.0.0-preview2-windowsservercore-sdk
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .
注意:我听说使用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 ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
d32a981ceabb aspnetcoreonwindows "dotnet WebApplicatio" 0.0.0.0:87->82/tcp compassionate_blackwell
a179a48ca9f6 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:86->82/tcp determined_stallman
170a8afa1b8b aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:89->82/tcp agitated_northcutt
afafdbead8b0 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:88->82/tcp naughty_ramanujan
2cf45ea2f008 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 SIZE
0ec4274c5571 web optimized 276.2 MB
f9f196304c95 web single 583.8 MB
f450043e0a44 microsoft/aspnetcore 1.0.1 266.7 MB
706045865622 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)准备妥当,我们就能拥有良好的调试环境,和从开发到生产的工作流支持。
到此,相信大家对“怎么在Linux和Windows的Docker容器中运行ASP.NET Core”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!