Windows 应用容器化
背景
在這個(gè)時(shí)間點(diǎn),我們可能已經(jīng)對(duì) Linux 容器使用已經(jīng)達(dá)到熟練掌握的程度,因?yàn)?Docker 與 Kubernetes 都是最早為 Linux 平臺(tái)設(shè)計(jì)。當(dāng)我們從容器這項(xiàng)技術(shù)中體會(huì)到種種收益,對(duì)于我們的 windows 的應(yīng)用是否也能利用容器技術(shù)簡(jiǎn)化我們的開(kāi)發(fā)運(yùn)維?對(duì)于大型的企業(yè)來(lái)說(shuō),Windows 系列的開(kāi)發(fā)程序也會(huì)占一定的比例,這個(gè)時(shí)候領(lǐng)導(dǎo)可能會(huì)有一個(gè)指示下來(lái):“我們 .Net 應(yīng)用也要上容器云”。
好的,任務(wù)拿到以后我們首先要解決的第一件事就是 Windows 應(yīng)用容器化,雖然我們知道 .Net Core 是一個(gè)可以跨平臺(tái)運(yùn)行,但仍然有很多使用 .Net Framwork 編寫(xiě)的應(yīng)用仍在運(yùn)行和迭代,所以 Docker on Windows 是一條必須要走的路,好在微軟和 Docker 在這方面有足夠的投入。
小貼士:對(duì)于企業(yè)來(lái)說(shuō),轉(zhuǎn)型并不是把原來(lái)所有的資產(chǎn)全部拋棄,是利用能利用的原有資產(chǎn)和新的技術(shù)繼續(xù)向前進(jìn)Windows 容器類(lèi)型
雖然我們常說(shuō) Container 的實(shí)現(xiàn)方案不僅只有 Docker, 但我們?cè)趯?shí)際使用上用的最最最多還是 Docker。這里心疼 Docker 三秒鐘?。在 Windows 容器化的實(shí)現(xiàn)上分為兩類(lèi):
- Hyper-V 容器
- 類(lèi)似于 Docker on Mac, Docker on Windows 也經(jīng)歷了通過(guò)基于 Hypervisor 的虛擬化技術(shù)來(lái)實(shí)現(xiàn)非原生 Linux 平臺(tái)上的容器方案。 Mac 上使用的是 hyperkit ,Windows 上有 Hyper-V 。
- 這就相當(dāng)于每個(gè)容器運(yùn)行在一個(gè)被高度優(yōu)化過(guò)的虛擬機(jī)里,他們之間不共享操作系統(tǒng)內(nèi)核,好處是會(huì)有更好的安全隔離性,以及在操作系統(tǒng)的內(nèi)核上有更多的選擇性。
- Native 容器
- 類(lèi)似于我們?cè)?Linux 上使用的容器,基于 process 和 namespace 的隔離。
這兩種不同的容器類(lèi)型,從操作角度上是一致的,像Build、Push、Run 等等,不同的是它是 Windows 環(huán)境,需要使用 powershell 或者 cmd 去寫(xiě) Dockerfile, 當(dāng)然這個(gè)對(duì)于 Windows 的運(yùn)維人員沒(méi)什么問(wèn)題。
Windows Dockerfile 示例
看一個(gè)簡(jiǎn)單的例子:
FROM microsoft/windowsservercore:1803COPY ConsoleTest.exe C:/ENTRYPOINT C:/ConsoleTest.exe我們注意到這個(gè) Dockerfile 的 base 鏡像是 windowsservercore:1803 ,意味著這個(gè)鏡像是可以和 windowsserver 1803 兼容的 Docker 鏡像, 這里提到到了一個(gè) Windows Host OS 與 容器 OS 的版本兼容性:
| 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 |
翻譯過(guò)是:
再看一個(gè)例子:
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 -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 80ENTRYPOINT ["powershell", "C:/runapp.ps1"]上面的例子做了一件事是把 iis 的文件日志輸出通過(guò) tail 的方式轉(zhuǎn)換成了標(biāo)準(zhǔn)輸出,這樣 docker logs 就能看到日志輸出了
提問(wèn)?
下一篇: 快速搭建 Windows Kubernetes 環(huán)境
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
轉(zhuǎn)載于:https://www.cnblogs.com/bigdaddyblog/p/9672415.html
總結(jié)
以上是生活随笔為你收集整理的Windows 应用容器化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 做梦梦到僵尸是什么征兆
- 下一篇: 2018-2019 20165203 《