在這個時間點,咱們可能已經對 Linux 容器使用已經達到熟練掌握的程度,由於 Docker 與 Kubernetes 都是最先爲 Linux 平臺設計。當咱們從容器這項技術中體會到種種收益,對於咱們的 windows 的應用是否也能利用容器技術簡化咱們的開發運維?對於大型的企業來講,Windows 系列的開發程序也會佔必定的比例,這個時候領導可能會有一個指示下來:「咱們 .Net 應用也要上容器雲」。html
好的,任務拿到之後咱們首先要解決的第一件事就是 Windows 應用容器化,雖然咱們知道 .Net Core 是一個能夠跨平臺運行,但仍然有不少使用 .Net Framwork 編寫的應用仍在運行和迭代,因此 Docker on Windows 是一條必需要走的路,好在微軟和 Docker 在這方面有足夠的投入。git
小貼士: 對於企業來講,轉型並非把原來全部的資產所有拋棄,是利用能利用的原有資產和新的技術繼續向前進
雖然咱們常說 Container 的實現方案不只只有 Docker, 但咱們在實際使用上用的最最最多仍是 Docker。這裏心疼 Docker 三秒鐘😭。在 Windows 容器化的實現上分爲兩類:github
這兩種不一樣的容器類型,從操做角度上是一致的,像Build、Push、Run 等等,不一樣的是它是 Windows 環境,須要使用 powershell 或者 cmd 去寫 Dockerfile, 固然這個對於 Windows 的運維人員沒什麼問題。web
看一個簡單的例子: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 process orhyperv isolation |
Supports Onlyhyperv isolation |
Supports Onlyhyperv isolation |
Supports Onlyhyperv isolation |
Supports Onlyhyperv isolation |
Supports Onlyhyperv isolation |
Windows Server version 1709 Builds 16299. | Not supported | Not supported | Supports process orhyperv isolation |
Supports Onlyhyperv isolation |
Supports Onlyhyperv isolation |
Supports Onlyhyperv isolation |
Windows Server version 1803 Builds 17134. | Not supported | Not supported | Not supported | Not supported | Supports process orhyperv isolation |
Supports Onlyhyperv isolation |
翻譯過是:windows
再看一個例子:安全
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 -WaitDockerfile
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
就能看到日誌輸出了
下一篇: 快速搭建 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