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.pswp.cn/news/396793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396793.shtml
英文地址,請注明出處:http://en.pswp.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…