上一篇我们基于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 总结

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

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

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

传统.NET 4.x应用容器化体验(2)的更多相关文章

  1. 传统.NET 4.x应用容器化体验(1)

    我们都知道.NET Core应用可以跑在Docker上,那.NET Framework 4.x应用呢?借助阿里云ECS主机(Windows Server 2019 with Container版本), ...

  2. 传统.NET 4.x应用容器化体验(4)

    上一篇我们试着将.NET 4.x的镜像推送到harbor私有镜像仓库,本篇我们来使用一下阿里云的镜像仓库服务并了解一下携程的实践. 1 关于阿里云镜像仓库 阿里云容器镜像服务(简称 ACR)是面向容器 ...

  3. 传统.NET 4.x应用容器化体验(5)

    前面几篇都是基于阿里云ECS直接玩的,有童鞋问直接用Windows Server 2019可以玩不,本篇就为你介绍一下如何给Windows Server 2019配置Docker环境. 1 准备工作 ...

  4. 传统.NET 4.x应用容器化体验(3)

    上一篇我们自己通过编写Dockerfile来编译部署一个ASP.NET MVC应用程序到Windows Container,这一篇我们来试着将.NET 4.x的镜像推送到harbor私有镜像仓库. 1 ...

  5. 容器化ICT融合初体验

    [编者的话]本次将分享的容器化ICT融合平台是一种面向未来ICT系统的新型云计算PaaS平台,它基于容器这一轻量级的虚拟化技术以及自动化的"微服务"管理架构,能够有效支撑应用快速上 ...

  6. Rio手把手教学:如何打造容器化应用程序的一站式部署体验

    11月19日,业界应用最为广泛的Kubernetes管理平台创建者Rancher Labs(以下简称Rancher)宣布Rio发布了beta版本,这是基于Kubernetes的应用程序部署引擎.它于今 ...

  7. Docker最全教程——MongoDB容器化(十二)

    MongoDB容器化 MongoDB是一个免费的.开源的.跨平台分布式面向文档存储的数据库,由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和 ...

  8. 开箱即用,Knative 给您极致的容器 Serverless 体验

    作者 | 冬岛  阿里巴巴技术专家 导读:托管 Knative 开箱即用,您不需要为这些常驻实例付出任何成本.结合 SLB 云产品提供 Gateway 的能力以及基于突发性能型实例的保留规格功能,极大 ...

  9. 4 个场景揭秘,如何低成本让容器化应用 Serverless 化?

    作者 | changshuai FaaS 的门槛 Serverless 形态的云服务帮助开发者承担了大量复杂的扩缩容.运维.容量规划.云产品打通集成等责任,使得开发者可以专注业务逻辑.提高交付速度 ( ...

随机推荐

  1. gin中间件推荐

    中间件推荐 1.1.1. 列表 谷歌翻译欢迎查看原文 https://github.com/gin-gonic/contrib/blob/master/README.md RestGate - RES ...

  2. es 查询更新操作

    # es 查询更新操作# _*_ coding: utf-8 _*_ import time import datetime import pymysql from elasticsearch imp ...

  3. Python+Selenium自动化-设置等待三种等待方法

    Python+Selenium自动化-设置等待三种等待方法   如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候,就需要我们通过设置一个等待条件,等待页面元素加载完成,避免出现 ...

  4. Processing平台之PVector求角度

    问题:在processing 平台,通过给定三个PVector向量,如何求他们之间的夹角,同时确定是在左侧还是右侧? 如图所示,在processing 平台中,PVector表示点的坐标是以原点为起点 ...

  5. LATEX如何写多个条件推导式推出一个结论

    用markdown写推导式的时候,不太好写,故做个笔记记录一下,插入 公式块 : \left. \begin{aligned} \left. \begin{aligned} \text{这里可以写文字 ...

  6. 目标形体形状轮廓重建:ICCV2019论文解析

    目标形体形状轮廓重建:ICCV2019论文解析 Shape Reconstruction using Differentiable Projections and Deep Priors 论文链接: ...

  7. 国内操作系统OS分析(上)

    国内操作系统OS分析(上) 一.操作系统(OS)概述 操作系统(OS,Operating System),是管理.控制计算机软硬件资源的计算机程序,并为用户提供一个与系统交互的操作界面.OS是配置在计 ...

  8. 国内操作系统OS分析(下)

    国内操作系统OS分析(下) 3.2 Android/iOS移动互联网时代 Android是一种基于Linux的自由及开放源代码的操作系统.主要使用于移动设备,如智能手机和平板电脑,由Google公司和 ...

  9. CodeGen准备存储库

    CodeGen准备存储库 CodeGen几乎总是与提供用于生成源文件的元数据的存储库结构一起使用,并且许多令牌需要使用存储库结构. 基本要求是有一个结构定义,并且该结构定义包含一个或多个字段定义.有些 ...

  10. Git与GitHub入门

    一.git起步https://www.runoob.com/git/git-install-setup.html1.下载git(Windows)2.安装GUI(TortoiseGit)3.查看git配 ...