Windows 應用容器化

背景

在這個時間點,咱們可能已經對 Linux 容器使用已經達到熟練掌握的程度,由於 Docker 與 Kubernetes 都是最先爲 Linux 平臺設計。當咱們從容器這項技術中體會到種種收益,對於咱們的 windows 的應用是否也能利用容器技術簡化咱們的開發運維?對於大型的企業來講,Windows 系列的開發程序也會佔必定的比例,這個時候領導可能會有一個指示下來:「咱們 .Net 應用也要上容器雲」。html

好的,任務拿到之後咱們首先要解決的第一件事就是 Windows 應用容器化,雖然咱們知道 .Net Core 是一個能夠跨平臺運行,但仍然有不少使用 .Net Framwork 編寫的應用仍在運行和迭代,因此 Docker on Windows 是一條必需要走的路,好在微軟和 Docker 在這方面有足夠的投入。git

小貼士:
  對於企業來講,轉型並非把原來全部的資產所有拋棄,是利用能利用的原有資產和新的技術繼續向前進

Windows 容器類型

雖然咱們常說 Container 的實現方案不只只有 Docker, 但咱們在實際使用上用的最最最多仍是 Docker。這裏心疼 Docker 三秒鐘😭。在 Windows 容器化的實現上分爲兩類:github

  • 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 的運維人員沒什麼問題。web

Windows Dockerfile 示例

看一個簡單的例子:docker

FROM microsoft/windowsservercore:1803

COPY ConsoleTest.exe C:/

ENTRYPOINT C:/ConsoleTest.exe

咱們注意到這個 Dockerfile 的 base 鏡像是 windowsservercore:1803 ,意味着這個鏡像是能夠和 windowsserver 1803 兼容的 Docker 鏡像, 這裏提到到了一個 Windows Host OS 與 容器 OS 的版本兼容性:shell

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

翻譯過是:windows

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

再看一個例子:安全

buildapp.ps1app

# 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 WebAdministration

New-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 80

ENTRYPOINT ["powershell", "C:/runapp.ps1"]

上面的例子作了一件事是把 iis 的文件日誌輸出經過 tail 的方式轉換成了標準輸出,這樣 docker logs 就能看到日誌輸出了

提問😂

  1. 什麼狀況下用 ContainerOS 使用 latest 的 tag?
  2. 若是是在 Kubernetes 的環境下除了經過轉換成標準輸出,還能怎樣採集 iis 的文件日誌?

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


Ref:

相關文章
相關標籤/搜索