借助阿里云ECS实现传统.NET应用容器化(中)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 上一篇我们基于阿里云ECS(Windwos Server 2019 with Container镜像版本)初步跑了一个ASP.NET WebForm应用程序。本篇我们来自己编译部署一个ASP.NET MVC应用程序到阿里云ECS中的Windows Container。

上一篇我们基于阿里云ECS(Windwos Server 2019 with Container镜像版本)初步跑了一个ASP.NET WebForm应用程序。本篇我们来自己编译部署一个ASP.NET MVC应用程序到Windows Container。

1 准备工作

这里我们直接从github上clone微软官方的dotnet-docker-samples项目,找到其中的aspnetmvc子项目。

github地址:https://github.com/Microsoft/dotnet-framework-docker

这是一个基于.NET 4.8的ASP.NET MVC应用程序,它运行起来和之前的ASP.NET WebForm的Sample一模一样,这里就不再演示。

clone下来后,在VS中编译一下然后发布一下Release文件,最后将Release文件复制到阿里云ECS的文件目录下。

2 直接通过aspnet镜像运行

首先,假设我们将其放到了C:\Releases\aspnetmvcapp目录下:

这里需要注意的是:和.NET Core不同,Dockerfile需要像上图一样放置在Release文件目录之外。而在.NET Core下,Dockerfile可以放置在Release文件目录下。

其次,我们看看这里的Dockerfile是如何写的。

# 运行环境
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8 AS runtime
# 工作目录
WORKDIR /inetpub/wwwroot
# 拷贝文件
COPY Publish/. ./

很简单,就三行搞定,拉取运行环境镜像aspnet:4.8,设置工作目录为/inetpub/wwwroot,最后将Publish文件目录下的所有文件拷贝至容器的工作目录之内,完事儿。然后,就是熟悉的build镜像过程了,还是原来的味道:

> docker build -t reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp .
Sending build context to Docker daemon  26.29MB
Step 1/3 : FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8 AS runtime
 ---> 451a15b86af7
Step 2/3 : WORKDIR /inetpub/wwwroot
 ---> Running in fe87a7e897ca
Removing intermediate container fe87a7e897ca
 ---> 8737f6c38bfb
Step 3/3 : COPY Publish/. ./
 ---> 419e149fcfc9
Successfully built 419e149fcfc9
Successfully tagged reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp

生成的镜像到底有多大?8.48G!

> docker images
REPOSITORY                                   TAG            IMAGE ID       CREATED          SIZE
reg.edisonzhou.cn/dotnet/samples                    aspnetmvcapp   419e149fcfc9   12 seconds ago   8.48GB
mcr.microsoft.com/dotnet/framework/aspnet    4.8            451a15b86af7   4 weeks ago      8.45GB

可以看到,基础运行镜像aspnet:4.8就有8.45G,我们打包出来的只多了300M左右。

为啥aspnet:4.8这个镜像这么大?通过浏览docker hub对应镜像的主页,我们可以了解到,这个镜像包括了以下几个组成部分:

翻译过来就是下面这几个部分:

(1) 操作系统镜像:Windows Server Core

(2) WebServer:IIS 10

(3) 基础框架:.NET Framework

(4) 框架扩展:.NET Extension for IIS

其中,操作系统镜像是最大的内容。关于这个镜像的细节,可以浏览:https://hub.docker.com/_/microsoft-dotnet-framework-aspnet

最后,我们可以直接基于我们打包的镜像来run一个容器实例了:

>docker run --name aspnet_mvc_sample --rm -it -d -p 8000:80 reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp

通过查看容器日志,我们可以了解到IIS已经成功启动本站点:

> docker logs aspnet_mvc_sample

 Service 'w3svc' has been stopped

 Service 'w3svc' started

最终的效果,我们也可以通过 http://localhost:8000 访问到,和上一篇的效果一模一样。

3 通过sdk编译打包一体化

我们都知道,在Dockerfile中除了可以直接简单地引入运行环境镜像,也可以引入sdk镜像来执行编译和打包的操作,这一特点十分适合在持续集成的任务中执行。

因此,首先,我们将上面的Dockerfile改一下:

FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetmvcapp/*.csproj ./aspnetmvcapp/
COPY aspnetmvcapp/*.config ./aspnetmvcapp/
RUN nuget restore

# copy everything else and build app
COPY aspnetmvcapp/. ./aspnetmvcapp/
WORKDIR /app/aspnetmvcapp
RUN msbuild /p:Configuration=Release -r:False

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8 AS runtime
WORKDIR /inetpub/wwwroot
COPY --from=build /app/aspnetmvcapp/. ./

其次,我们将源代码拷贝到阿里云ECS下,假设在C:\Sources\aspnetmvcapp目录下。

然后,就又是熟悉的build镜像过程了,还是原来的味道:

> docker build -t reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp-v2 .

这里编译涉及到Nuget Restore的过程,可能会稍微慢一点。

有了打包好的镜像,我们再来运行一下容器实例:

> docker stop aspnet_mvc_sample
> docker run --name aspnet_mvc_sample --rm -it -d -p 8000:80 reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp-v2

最终的效果,我们还是可以通过 http://localhost:8000 访问到。

4 更多

Docker Compose

我们也可以在Windows Server上安装Docker Compose来进行单主机的容器编排,在Linux上操作Docker Compose的经验同样也可以平滑迁移到Windows Container上:

>Invoke-WebRequest https://github.com/docker/compose/releases/download/1.25.4/docker-compose-Windows-x86_64.exe -UseBasicParsing -OutFile $env:ProgramFiles\docker\docker-compose.exe
>docker-compose version

资源限制

我们也可以为Windows Container设置资源限制,例如下面我们为ASP.NET MVC的这个sample设置只能使用1个cpu,最大内存限制1024M:

docker run --name aspnet_mvc_sample --rm -it -d -p 8000:80 --cpus 1 -m 1024m reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp

挂载本地文件

我们也可以为Windows Container挂载本地文件目录用于映射应用程序的文件,比如config文件等:

docker run --name aspnet_mvc_sample --rm -it -d -p 8000:80 --cpus 1 -m 1024m -v C:\IIS\config\aspnetmvcapp:C:\inetpub\wwwroot\Configs reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp

5 总结

本文介绍了如何在基于阿里云ECS的Windows Container下通过Dockerfile实现.NET 4.x应用程序的编译打包构建过程,并以一个ASP.NET MVC的Sample示例演示了整个过程。

下一篇,我们会实现将编译的镜像推送到阿里云镜像仓库 和 harbor私有镜像仓库 ,并尝试在Windows Server端拉取容器镜像仓库中的镜像并run一下。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
存储 弹性计算 安全
阿里云第七代云服务器ECS性能、适用场景与价格参考
阿里云第七代云服务器ECS(Elastic Compute Service)作为阿里云最新一代的高性能计算产品,凭借其基于最新硬件架构和虚拟化技术的全面升级,在计算能力、存储性能、网络传输速度以及灵活性等多个方面实现了显著提升。这一代云服务器旨在为用户提供更为强大、稳定且可定制的云端基础设施服务,广泛适用于从基础的Web托管到复杂的高性能计算等多种应用场景。
|
5天前
|
弹性计算 网络安全
阿里云国际OpenAPI多接口快速管理ECS服务器教程
阿里云国际OpenAPI多接口快速管理ECS服务器教程
|
3天前
|
弹性计算 开发框架 .NET
阿里云服务器购买教程及云服务器地域、实例、操作系统、带宽等参数选择指南
对于初次购买阿里云服务器的用户来说,想使用阿里云服务器搭建网站或者运行APP、小程序等项目,第一步就是要先购买阿里云服务器,下面小编以图文形式给大家介绍一下阿里云服务器的购买流程,以及购买过程中如何云服务器地域、实例、带宽等关键配置和选择这些参数的一些注意事项,以供参考。
|
4天前
|
监控 网络安全 调度
Quartz.Net整合NetCore3.1,部署到IIS服务器上后台定时Job不被调度的解决方案
解决Quartz.NET在.NET Core 3.1应用中部署到IIS服务器上不被调度的问题,通常需要综合考虑应用配置、IIS设置、日志分析等多个方面。采用上述策略,结合细致的测试和监控,可以有效地提高定时任务的稳定性和可靠性。在实施任何更改后,务必进行充分的测试,以验证问题是否得到解决,并监控生产环境的表现,确保长期稳定性。
10 1
|
5天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
6天前
|
域名解析 网络协议 数据安全/隐私保护
阿里云轻量应用服务器搭建WordPress个人博客教程
阿里云轻量应用服务器搭建WordPress个人博客教程
|
8天前
|
运维 JavaScript 虚拟化
探索容器化技术:Docker的实践与应用
【10月更文挑战第9天】探索容器化技术:Docker的实践与应用
31 3
|
8天前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
10天前
|
存储 机器学习/深度学习 应用服务中间件
阿里云倚天云服务器实例:计算型c8y、通用型g8y、内存型r8y实例介绍
阿里云倚天云服务器是基于阿里云自研的倚天710 ARM架构CPU打造的高性能计算产品系列,它依托先进的第四代神龙架构,旨在为用户提供稳定可预期的超高效能体验。倚天云服务器在存储、网络性能及计算稳定性方面实现了显著提升,主要得益于其芯片级的快速路径加速技术。本文将深度解析阿里云倚天云服务器的计算型c8y、通用型g8y、内存型r8y实例,探讨其优势及适用场景,以供选择参考。
|
11天前
|
网络协议 应用服务中间件 网络安全
阿里云轻量应用服务器的使用限制
阿里云轻量应用服务器的使用限制