上一篇我们基于阿里云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:aspnetmvcapp5 总结
本文介绍了如何在基于阿里云ECS的Windows Container下通过Dockerfile实现.NET 4.x应用程序的编译打包构建过程,并以一个ASP.NET MVC的Sample示例演示了整个过程。
下一篇,我们会实现将编译的镜像推送到阿里云镜像仓库 和 harbor私有镜像仓库 ,并尝试在Windows Server端拉取容器镜像仓库中的镜像并run一下。
镜像源为 云服务器 或镜像文件 表1 云服务器 相关配置项 操作系统 相关配置项 参...
每次使用借记卡或信用卡时,都会发生两件事。其付款是无障碍的,因为不必随身携...
在本文中,我们将对Golang与Node.js进行后端开发进行比较分析。一个年轻的明星与...
如果问到便宜的 服务器租用 选择哪家服务商比较好?这里我推荐TOP云(zuntop.com...
1. 部署结构 在Clickhouse中, 一般的有2种部署方式,3种使用方式: clickhouse...
实现 Kubernetes 动态LocalVolume挂载本地磁盘前言 在 Kubernetes 体系中,存在...
为了满足企业协同办公需求,微软推出了office 365,但是微软的竞争对手们也紧随其...
网站 虚拟主机 选多大好?很多新手站长,对于网站虚拟主机还不是很了解,不知道...
世界因“云”而变 然而 数据库迁移上云门槛高、周期长 上云路径这么多 怎么选 如...
-更多关于数智化转型、数据中台内容请加入 阿里云数据中台交流群—数智俱乐部 和...