Windows 应用容器化

背景

在这个时间点,我们可能已经对 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 versionHost 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 processorhypervisolationSupports OnlyhypervisolationSupports OnlyhypervisolationSupports OnlyhypervisolationSupports OnlyhypervisolationSupports Onlyhypervisolation
Windows Server version 1709 Builds 16299.Not supportedNot supportedSupports processorhypervisolationSupports OnlyhypervisolationSupports OnlyhypervisolationSupports Onlyhypervisolation
Windows Server version 1803 Builds 17134.Not supportedNot supportedNot supportedNot supportedSupports processorhypervisolationSupports 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python安装函数库pip网址_批量安装python库函数---pip

android Sqlite小记 1.android.database.sqlite.SQLiteException: near "": syntax error (code 1): 语法错误,如果你的报了这个错误 ... win8 VB6打开提示MSCOMCTL.ocx未注册 从xp上复制相应的文件到win8相应的位置,如果是不可以,win8中反注册此控件,再注…

关于OC中的block自己的一些理解(二)

一、block延伸:页面间反向传值 1)first页面的代码 - (void)viewDidLoad {[super viewDidLoad];[self setupBtn];self.view.backgroundColor [UIColor whiteColor];} - (void)setupBtn {UIButton * btn [[UIButton alloc]init];[btn addTarget:self act…

C语言多项式乘法模拟,急!!!!c语言:求n次多项式的加法和乘法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼if(s->data.coef!0.0){s->data.expnp->data.expn;r->nexts;rs;}pp->next;qq->next;break;case 1:s->data.coefq->data.coef;s->data.expnq->data.expn;r->nexts;rs;qq->next;break;}//switch}…

opengl 安装_如何使得支持 OpenGL 的 Flatpak 应用和游戏在专有 Nvidia 图形驱动下工作 | Linux 中国...

一些支持 OpenGL 并打包为 Flatpak 的应用和游戏无法使用专有 Nvidia 驱动启动。本文将介绍如何在不安装开源驱动(Nouveau)的情况下启动这些 Flatpak 应用或游戏。-- Logix这有个例子。我在我的 Ubuntu 18.04 桌面上使用专有的 Nvidia 驱动程序 (nvidia-driver-390)&#xff0c…

laravel -admin 禁止某一行删除

$grid->actions(function (Grid\Displayers\Actions $actions) {if ($actions->getKey() 1) {$actions->disableDelete();} });转载于:https://www.cnblogs.com/vinzen/p/9675823.html

thinkphp-where-数组条件-普通查询

语法Db::table(表名)->where(条件)->select();示例$map[name] thinkphp; $map[status] 1;// 把查询条件传入查询方法 Db::table(think_user)->where($map)->select();对应原始sqlSELECT * FROM think_user WHERE namethinkphp AND status1转载于:https://blog.51…

RequireJS入门(一)

RequireJS由James Burke创建,他也是AMD规范的创始人。 RequireJS会让你以不同于往常的方式去写JavaScript。你将不再使用script标签在HTML中引入JS文件,以及不用通过script标签顺序去管理依赖关系。 当然也不会有阻塞(blocking)的…

Oracle数据库中游标的游标的使用

本人不喜欢说概念啥的,就直接说明使用方法吧 案例1: 1 DECALRE2 --声明游标3 CURSOR C_USER(C_ID NUMBER) IS4 SELECT NAME FROM USER WHERE TYPEID C_ID;5 V_NAME C_USER%rowtype; --定义游标变量6 BEGIN7 OPEN C_USER(变量值); …

eclipse占用内存过大_idea被评最好用java开发工具,为什么用eclipse的人更多?

从事java开发一般都需要使用到一些开发工具,记得以前刚接触java的时候还用过MyEclipse。idea被评为最好用java开发工具,为什么用eclipse的人更多?下面一起来了解下吧!IDEA毕竟不便宜啊,很多企业都买不起只能用Eclipse了&#xff…

Asp.net mvc 知多少(六)

本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可访问http://www.dotnettricks.com/free-ebooks自行下载。该书主要分为两部分,ASP.NET MVC 5、ASP.NET WEB API2。本书最大的特点是以面试问答…

数据结构c语言版总结,数据结构:C语言常见算法总结

【1】求最大值与最小值.#includevoid main(){int num[5],max,min,i;printf(\"请输入5个数字:\")for(i0;i<5;i)scanf(\"%d\",&num)maxnum[0];minnum[0];for(i1;i<5;i){if(maxmaxnum;if(min>num)minnum;}printf(\"最大值为:%d\",max)…

selenium选错弹出层的下拉框

要先选中这个弹出层的form元素&#xff0c;再找下拉框 public void downSelectBox(){driver.get("https://www.imooc.com/user/setprofile");driver.findElement(By.className("pull-right")).click();try {Thread.sleep(2000);} catch (InterruptedExcept…

python面向过程是基于面向对象的_Python5.1-面向对象与面向过程

面向对象&#xff1a; 将数据与函数绑定在一起&#xff0c;进行封装&#xff0c; 这样能够更快速的开发程序&#xff0c;减少了重复 代码的重写过程。 优点&#xff1a; 易维护、易复用、易扩展&#xff0c;由于面向对象有封装、继承、多态性的特性&#xff0c;可以设 计出低耦…

C语言 1A gt $20,C语言输出 1到20 的阶乘之和

除了调用库&#xff0c;绝对找不到比这更精简的代码了.#include#includelong long getdata(long long n){long long sum 1;while(n){sum*n--;}return sum;}int main(){long long sum 0;long long nums 20;while(nums){sumgetdata(nums--);}printf("%lld",sum);}【…

PHP设计模式——策略模式

<?php /*** 策略模式* 策略模式帮助构建的对象不必自身包含逻辑&#xff0c;而是能够根据需要利用其他对象中的算法* * 在能够创建基于对象的&#xff0c;由自包含算法组成的可互换对象时&#xff0c;最佳的做法是使用策略模式 */ interface Math{function calc($op1,$op2)…

自动化收益评估

1.自动化测试实施成本&#xff1a;自动化实施成本 前期开发成本 后期维护成本 2.自动化测试收益 自动化测试的运行次数 3.自动化测试实施成本比&#xff1a;怕 k*n/&#xff08;cic2&#xff09; k--手工执行自动化用例所花费的时间成本&#xff0c;n--自动化测试用例执行的次…

32位PLSQL Developer无法登录Oracle 11g 64位

问题&#xff1a; Windows10 64位下装Oracle 11g 64位&#xff0c;PLSQL Developer使用出现以下问题&#xff1a; 1、Database下拉框为空&#xff1a; 2、强制输入用户名、密码及Database&#xff0c;登录弹出&#xff1a; 说明PLSQL Developer并不支持Oracle 64位客户端连接。…

python快速排序函数_python算法-快速排序

快速排序&#xff1a; 学习快速排序&#xff0c;要先复习下递归&#xff1a; 递归的2个条件&#xff1a; 1. 函数自己调用自己 2.有一个退出的条件 练习&#xff1a;基于递归下一个函数&#xff0c;计算n&#xff01;并且求出当n等于10的值。 n&#xff01;n * n-1*…..*1 #enc…

c语言课程结束,【计算机】程序设计——C语言基础秋季学期课程圆满结束

2019年10月22日11&#xff1a;40&#xff0c;在同学们发自内心的掌声中&#xff0c;课外培养中心开办的程序设计——C语言基础课程圆满落幕。本次课程由计算机中心的陶媛老师予以指导&#xff0c;在短短五次课的时间里&#xff0c;同学们对学习C语言都有了更深的体悟。对于大部…

struts2获取请求参数的三种方式及传递给JSP参数的方式

接上一篇文章package test;import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.*; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import java.util.*; public class HelloAction extends ActionSup…