zoukankan      html  css  js  c++  java
  • 传统.NET 4.x应用容器化体验(2)

    上一篇我们基于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:Releasesaspnetmvcapp目录下:

    这里需要注意的是:和.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:Sourcesaspnetmvcapp目录下。

    然后,就又是熟悉的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:ProgramFilesdockerdocker-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:IISconfigaspnetmvcapp:C:inetpubwwwrootConfigs reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp

    5 总结

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

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

  • 相关阅读:
    linux shell编程学习笔记(二) --- grep命令
    linux shell编程学习笔记(一)---通配符,元字符
    正则表达式
    leetcode problem 37 -- Sudoku Solver
    leetcode problem 33 -- Search in Rotated Sorted Array
    linux 终端快捷键
    linux中的sticky bit
    集中不等式
    Python os模块实例之遍历目录及子目录指定扩展名的文件
    Python模块之ConfigParser
  • 原文地址:https://www.cnblogs.com/edisonchou/p/dotnet_framework_application_on_docker_part2.html
Copyright © 2011-2022 走看看