在上一篇文章中,我们使用windows server 2019 with container初步运行了一个asp.net webform应用程序。本文将详细介绍如何编译并部署一个asp.net mvc应用程序到windows container。
我们直接从GitHub上克隆微软官方的dotnet-docker-samples项目,并找到其中的aspnetmvc子项目。
GitHub地址:https://www.php.cn/link/b081b509da27866728d73c3f5d75ccaf
这个项目是一个基于.NET 4.8的ASP.NET MVC应用程序,运行效果与之前的ASP.NET WebForm示例相同,这里不再展示。

克隆下来后,使用VS编译并发布Release文件,最后将Release文件复制到阿里云ECS的文件目录中。
假设我们将文件放置在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/. ./
这个Dockerfile非常简洁,只需三行代码:拉取aspnet:4.8运行环境镜像,设置工作目录为/inetpub/wwwroot,最后将Publish目录下的所有文件复制到容器的工作目录中。接下来是熟悉的构建镜像过程:
> 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) Web服务器:IIS 10
(3) 基础框架:.NET Framework
(4) 框架扩展:.NET Extension for IIS
其中,操作系统镜像是最大的内容。关于这个镜像的更多细节,可以浏览:https://www.php.cn/link/32e22c26cece29777049a84adf05f465
最后,我们可以基于打包的镜像启动一个容器实例:
> 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访问,效果与上一篇文章相同。

我们知道,Dockerfile不仅可以直接引入运行环境镜像,还可以引入sdk镜像来执行编译和打包操作,这在持续集成任务中非常有用。
因此,我们首先修改上面的Dockerfile:
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build WORKDIR /app # 复制csproj并恢复为不同的层 COPY *.sln . COPY aspnetmvcapp/*.csproj ./aspnetmvcapp/ COPY aspnetmvcapp/*.config ./aspnetmvcapp/ RUN nuget restore # 复制其他内容并构建应用程序 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目录下。

接下来是熟悉的构建镜像过程:
> 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访问。

我们还可以在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的示例设置只能使用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挂载本地文件目录,用于映射应用程序的文件,比如配置文件等:
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
本文详细介绍了如何在Windows Container下通过Dockerfile实现.NET 4.x应用程序的编译打包构建过程,并以一个ASP.NET MVC的示例演示了整个过程。
下一篇文章中,我们将实现将编译的镜像推送到Harbor私有镜像仓库,并尝试在Windows Server端拉取Harbor中的镜像并运行。
以上就是传统.NET 4.x应用容器化体验(2)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号