背景

在这个时间点,我们可能已经对 Linux 容器使用已经达到熟练掌握的程度,因为 Docker 与 Kubernetes 都是最早为 Linux 平台设计。当我们从容器这项技术中体会到种种收益,对于我们的 windows 的应用是否也能利用容器技术简化我们的开发运维?对于大型的企业来说,Windows 系列的开发程序也会占一定的比例,这个时候领导可能会有一个指示下来:“我们 .Net 应用也要上容器云”。

好的,任务拿到以后我们首先要解决的第一件事就是 Windows 应用容器化,虽然我们知道 .Net Core 是一个可以跨平台运行,但仍然有很多使用 .Net Framwork 编写的应用仍在运行和迭代,所以 Docker on Windows 是一条必须要走的路,好在微软和 Docker 在这方面有足够的投入。

小贴士:对于企业来说,转型并不是把原来所有的资产全部抛弃,是利用能利用的原有资产和新的技术继续向前进

Windows 容器类型

虽然我们常说 Container 的实现方案不仅只有 Docker, 但我们在实际使用上用的最最最多还是 Docker。这里心疼 Docker 三秒钟?。在 Windows 容器化的实现上分为两类:

  • Hyper-V 容器

    • 类似于 Docker on Mac, Docker on Windows 也经历了通过基于 Hypervisor 的虚拟化技术来实现非原生 Linux 平台上的容器方案。 Mac 上使用的是 hyperkit ,Windows 上有 Hyper-V 。
    • 这就相当于每个容器运行在一个被高度优化过的虚拟机里,他们之间不共享操作系统内核,好处是会有更好的安全隔离性,以及在操作系统的内核上有更多的选择性。
  • Native 容器
    • 类似于我们在 Linux 上使用的容器,基于 process 和 namespace 的隔离。

这两种不同的容器类型,从操作角度上是一致的,像Build、Push、Run 等等,不同的是它是 Windows 环境,需要使用 powershell 或者 cmd 去写 Dockerfile, 当然这个对于 Windows 的运维人员没什么问题。

Windows Dockerfile 示例

看一个简单的例子:

FROM microsoft/windowsservercore:1803COPY ConsoleTest.exe C:/ENTRYPOINT C:/ConsoleTest.exe

我们注意到这个 Dockerfile 的 base 镜像是 windowsservercore:1803 ,意味着这个镜像是可以和 windowsserver 1803 兼容的 Docker 镜像, 这里提到到了一个 Windows Host OS 与 容器 OS 的版本兼容性:

Container OS version Host OS Version
Windows Server 2016 Builds: 14393. Windows 10 1609, 1703 Builds: 14393., 15063. Windows Server version 1709 Builds 16299. Windows 10 Fall Creators Update Builds 16299. Windows Server version 1803 Builds 17134. Windows 10 version 1803 Builds 17134.
Windows Server 2016 Builds: 14393. Supports processorhypervisolation Supports Onlyhypervisolation Supports Onlyhypervisolation Supports Onlyhypervisolation Supports Onlyhypervisolation Supports Onlyhypervisolation
Windows Server version 1709 Builds 16299. Not supported Not supported Supports processorhypervisolation Supports Onlyhypervisolation Supports Onlyhypervisolation Supports Onlyhypervisolation
Windows Server version 1803 Builds 17134. Not supported Not supported Not supported Not supported Supports processorhypervisolation Supports Onlyhypervisolation

翻译过是:

  1. 相同的 OS 版本可以支持 native container 和 hyperv container
  2. Host OS 版本高,Container OS 版本低,可以用 hyperv container
  3. Container OS 比 Host OS 高? 那就不行了。

再看一个例子:

buildapp.ps1

# Remove existing default web site files
remove-item C:\inetpub\wwwroot\iisstart.*# Ensure write permissions over web app project files
icacls C:\inetpub\wwwroot\WebTest /grant Everyone:F /t /q# Import necessary IIS modules then set app project folder as web application
Import-Module IISAdministration
Import-Module WebAdministrationNew-Item 'IIS:\Sites\Default Web Site\WebTest' -Type Application -PhysicalPath 'C:\inetpub\wwwroot\WebTest'
Set-WebConfigurationProperty -p 'MACHINE/WEBROOT/APPHOST' -fi 'system.applicationHost/log' -n 'centralLogFileMode' -v 'CentralW3C'; `
Set-WebConfigurationProperty -p 'MACHINE/WEBROOT/APPHOST' -fi 'system.applicationHost/log/centralW3CLogFile' -n 'truncateSize' -v 4294967295; `
Set-WebConfigurationProperty -p 'MACHINE/WEBROOT/APPHOST' -fi 'system.applicationHost/log/centralW3CLogFile' -n 'period' -v 'MaxSize'; `
Set-WebConfigurationProperty -p 'MACHINE/WEBROOT/APPHOST' -fi 'system.applicationHost/log/centralW3CLogFile' -n 'directory' -v 'c:\iislog'

runapp.ps1

Start-Service W3SVC; `
Invoke-WebRequest http://localhost -UseBasicParsing | Out-Null; `
netsh http flush logbuffer | Out-Null; `
Get-Content -path 'c:\iislog\W3SVC\u_extend1.log' -Tail 1 -Wait

Dockerfile

FROM microsoft/dotnet-framework:4.7.2-sdk-20180814-windowsservercore-1803# WebTest.NET dependencies
RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
RUN powershell add-windowsfeature web-asp-net45# Configure Web App
COPY runapp.ps1 buildapp.ps1 WebTest.zip C:/SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
RUN  powershell -Command { Expand-Archive -Path C:\WebTest.zip -DestinationPath C:\inetpub\wwwroot\WebTest }
RUN  powershell -Command { Remove-Item C:\WebTest.zip -Force }RUN powershell.exe C:/buildapp.ps1
EXPOSE 80ENTRYPOINT ["powershell", "C:/runapp.ps1"]

上面的例子做了一件事是把 iis 的文件日志输出通过 tail 的方式转换成了标准输出,这样 docker logs 就能看到日志输出了

提问?

  1. 什么情况下用 ContainerOS 使用 latest 的 tag?
  2. 如果是在 Kubernetes 的环境下除了通过转换成标准输出,还能怎样采集 iis 的文件日志?

下一篇: 快速搭建 Windows Kubernetes 环境


Ref:

  • https://docs.docker.com/docker-for-mac/
  • https://github.com/moby/hyperkit
  • https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/hyper-v-technology-overview
  • https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/#windows-container-types
  • https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility

转载于:https://www.cnblogs.com/bigdaddyblog/p/9672415.html

Windows 应用容器化相关推荐

  1. docker 虚拟机搭建mongodb一主一从一复制_Docker最全教程——MongoDB容器化(十三)...

    上一节我们讲述了数据库容器化之持久保存数据,本节将讲诉MongoDB容器化实践,并且接下来将逐步讲解其他数据库(MySql.Redis等等)的容器化实践,然后将讲诉一些分布式架构的项目实践.由于实践需 ...

  2. netcore更新dll要停止_使 .NET Core 应用程序容器化

    在本教程中,你将了解如何使用 Docker 容器化 .NET Core 应用. 容器具有很多特性和优点,如具有不可变的基础结构.提供可移植的体系结构和实现可伸缩性. 此影像可用于为本地开发环境.私有云 ...

  3. Spring Cloud Kubernetes容器化实践

    随着公司业务量和产品线的增加,项目越来越多,普通运维系统架构对整个软件研发生命周期的管理越来越难,效率低下,难以统一管理.近年来Docker统一了容器标准,对于软件开发流程产生了深远的影响,Docke ...

  4. .NET Core容器化@Docker

    转自圣杰.https://www.jianshu.com/p/23465dc86d3e .NET Core容器化@Docker 圣杰 已关注 2017.12.22 21:59* 字数 2999 阅读 ...

  5. Docker最全教程——数据库容器化之持久保存数据(十一)

    Docker最全教程--数据库容器化之持久保存数据(十一) 原文:Docker最全教程--数据库容器化之持久保存数据(十一) 上一节我们讲述了SQL Server容器化实践(注意,SQL Server ...

  6. 如何容器化你的 ASP.Net Core

    Docker 相比 虚拟机 具有更轻量级,更便捷的特性,为什么这么说呢?虚拟机通常打包了完整的操作系统,而容器只仅仅打包了你的应用程序,运行环境及相关依赖库,Docker 是一种开源的工具包,帮助你更 ...

  7. 谈到云原生, 绕不开容器化

    传送门 什么是云原生? 云原生设计理念 .NET微服务 Containers 现在谈到云原生, 绕不开"容器". 在<Cloud Native Patterns>一书中 ...

  8. 使用Jexus 容器化您的 Blazor 应用程序

    在本文中,我们将介绍如何将 Blazor 应用程序放入Jexus 容器以进行开发和部署.我们将使用 .NET Core  CLI,因此无论平台如何,使用的命令都将是相同的. Blazor 托管模型 B ...

  9. 容器化单页面应用中RESTful API的访问

    最近在工作中,需要让运行在容器中的单页面应用程序能够访问外部的RESTful API.这个需求看起来并不困难,不过实现起来还是有些曲折的.在此,我就将这部分内容总结一下. 在入正题之前,有个一问题,就 ...

最新文章

  1. element not visible的解决方法
  2. 三星手机如何分屏_刷机基础知识三星如何手机进入ODIN模式
  3. OpenCV3 for python3 学习笔记3-----用OpenCV3处理图像2
  4. winr8文件服务器,技术讨论 | Windows全版本提权之Win10系列解析
  5. cad多个窗口并排显示_高版本CAD如何显示阵列窗口?
  6. 现代语音信号处理之短时傅里叶分析
  7. 战争机器5加速器信息:开发工作已经完成 更多内容将在科隆展上披露
  8. WPS公式编辑器编辑公式遇到的问题
  9. 高通骁龙845的android手机有哪些,骁龙845手机买什么好 目前6款最值得买的骁龙845手机推荐...
  10. PCM开发板模块实验指导--无刷马达实验
  11. 8255A并行 I/O 接口芯片
  12. 服务器认证信息,认证信息管理系统、服务器、方法和程序
  13. 2018年ACM-ICPC亚洲区域赛(焦作)赛后总结
  14. IKVM.NET的妙手偶得
  15. (附源码)ssm高校学生档案信息管理系统 毕业设计 010936
  16. mysql转sqlserver_mysql迁移sqlserver
  17. 一本通1034:计算三角形面积
  18. 2022帆软杯全国高校数据分析与应用联赛来啦!
  19. Magic Mouse鼠标滚动速度调整
  20. 智慧大田——智能无线灌溉系统

热门文章

  1. mysql 位操作支持
  2. 关于网页授权的两种scope的区别说明
  3. 个人学习进度(第十六周)
  4. BZOJ 1113: [Poi2008]海报PLA
  5. AutoMapperHelper
  6. CCF-CSP 最大的矩形
  7. C#异常处理机制初步
  8. Lecture 2 Asymptotic Notation
  9. numpy统计分布显示
  10. 1.10-linux三剑客之sed命令详解及用法