免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
2 docker化現(xiàn)有iis應(yīng)用的正確姿勢

聽說Windows支持原生docker了,大家一定都很興奮。然而,大家想過沒有,Windows Server Docker最適合什么場景呢?部署.NET Core應(yīng)用?為什么不選擇Linux下的docker?正常的決策者腦袋被門擠了才會(huì)花錢額外買Windows Server的license,用來部署.NET Core吧?所以,在本人看來,Windows Server Docker最大的價(jià)值,還是在于部署傳統(tǒng)基于WindowsServerCore的應(yīng)用。這樣的應(yīng)用一般有兩大類,一類是基于iis的網(wǎng)站應(yīng)用;另一類是Windows Service。本文主要關(guān)注基于iis的應(yīng)用的docker部署。

那么,部署一個(gè)iis應(yīng)用到docker,是不是只要起一個(gè)iis的docker容器實(shí)例,遠(yuǎn)程連接,并且,copy文件進(jìn)去,能通過容器內(nèi)的iis訪問就行了?如果,有人問這樣的問題,那么,說明他還完全沒有容器的思維。上面說的這個(gè),其實(shí)就成了將容器當(dāng)虛擬機(jī)用了,這將極大地限制了docker原有的靈活擴(kuò)展能力。因此,可以說是使用Windows docker最糟糕的姿勢之一了。

要正確部署一個(gè)iis應(yīng)用到Windows Server Docker,并不是表面那么簡單。限于篇幅,并且為了更專注,本文先不涉及容器編排、負(fù)載均衡、images的構(gòu)建和管理等問題(這些要考慮的問題還有很多,以后我們單獨(dú)聊),這里只關(guān)注如何將一個(gè)基于iis的應(yīng)用正確運(yùn)行于單個(gè)Windows Server Docker實(shí)例中。即便如此,一般至少也要解決下面這些問題:

  • Dockerfile:如何通過Dockerfile部署應(yīng)用文件和設(shè)置操作系統(tǒng)和IIS配置,如何為不同的運(yùn)行環(huán)境(開發(fā),測試,生產(chǎn))配置不同參數(shù);

  • 查看系統(tǒng)日志:典型的系統(tǒng)日志包含IIS Logs、Windows Event Log和應(yīng)用的異常日志;

  • 重啟容器實(shí)例:當(dāng)容器實(shí)例重啟時(shí),如何保證被部署的應(yīng)用能保持之前的工作狀態(tài),能繼續(xù)服務(wù);

  • 網(wǎng)絡(luò)路由:包括容器內(nèi)部如何訪問外部系統(tǒng)、docker宿主機(jī)如何訪問容器內(nèi)部、外部系統(tǒng)如何訪問容器內(nèi)部;

應(yīng)用示例

為便于理解和演示,我在github上寫了一個(gè)簡單的示例應(yīng)用:windows-docker-iis-demo

這個(gè)應(yīng)用只包含一個(gè)頁面,在我本機(jī)運(yùn)行時(shí),顯示類似下面的內(nèi)容:

Hello Docker!Configuration:env1=Dev (from appSettings in web.config)env2=Dev (from OS environment variable)Content of C:\Windows\System32\drivers\etc\hosts:# Localhost (DO NOT REMOVE)127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopback

其中env1為web.config中的appSettings值,env2讀取的系統(tǒng)環(huán)境變量,頁面最下面打印出當(dāng)前Windows系統(tǒng)的的hosts。

定義Dockerfile如下:

FROM microsoft/iis# install ASP.NET 4.5RUN dism /online /enable-feature /all /featurename:IIS-ASPNET45 /NoRestart# enable windows eventlogRUN powershell.exe -command Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\WMI\Autologger\EventLog-Application Start 1# set IIS log fieldsRUN /windows/system32/inetsrv/appcmd.exe set config /section:system.applicationHost/sites /siteDefaults.logFile.logExtFileFlags:'Date, Time, ClientIP, UserName, SiteName, ServerIP, Method, UriStem, UriQuery, HttpStatus, Win32Status, TimeTaken, ServerPort, UserAgent, Referer, HttpSubStatus'  /commit:apphost# deploy webappCOPY publish /inetpub/wwwroot/iis-demoRUN /windows/system32/inetsrv/appcmd.exe add app /site.name:'Default Web Site' /path:'/iis-demo' /physicalPath:'c:\inetpub\wwwroot\iis-demo'# set entrypoint scriptADD SetHostsAndStartMonitoring.cmd \SetHostsAndStartMonitoring.cmdENTRYPOINT ['C:\\SetHostsAndStartMonitoring.cmd']# declare volumesVOLUME ['c:/inetpub/logs/LogFiles']

我們分別來理解一下Dockerfile每一段的含義:

  • 首先是安裝ASP.NET 4.5;

  • 接著,開啟Windows EventLog;

  • 第三步,我們修改了默認(rèn)的IIS Logs字段列表;

  • 第四步,將當(dāng)前目錄下的publish目錄的內(nèi)容復(fù)制到容器的/inetpub/wwwroot/iis-demo目錄,并且在iis中添加對(duì)應(yīng)的iis-demo應(yīng)用;

  • 第五步,設(shè)置一個(gè)自定義的啟動(dòng)腳本;

  • 最后,聲明了一個(gè)VOLUME,以便將IIS Logs保存到容器外的宿主機(jī)上;

啟動(dòng)腳本SetHostsAndStartMonitoring.cmd的內(nèi)容如下:

powershell -executionpolicy bypass -Command 'If ($env:HOSTS) { $hosts = $env:HOSTS.Replace(':', ' ').Replace(',', '\r\n'); $hosts | Set-Content 'C:\Windows\System32\drivers\etc\hosts'; 'Applied hosts: ' + $hosts' }powershell -executionpolicy bypass -Command 'if ($env:env1) { (Get-Content 'c:\inetpub\wwwroot\iis-demo\web.config').replace('Dev', $env:env1) | Set-Content 'c:\inetpub\wwwroot\iis-demo\web.config' };c:\ServiceMonitor.exe w3svc

其中,第一部分讀取HOSTS這個(gè)系統(tǒng)環(huán)境變量,覆蓋當(dāng)前系統(tǒng)的hosts文件;第二步讀取env1環(huán)境變量,覆蓋web.config中的對(duì)應(yīng)配置;最后調(diào)用繼承自microsoft/iis image的ServiceMonitor.exe命令,監(jiān)控iis主進(jìn)程,直到其退出。

下面,我們來試著build這個(gè)docker。因?yàn)榈侥壳盀橹梗ū鞠盗械牡谝黄?第二篇),我們還只能從這臺(tái)Windows Server機(jī)器上執(zhí)行docker命令,以后的文章會(huì)講到如何從遠(yuǎn)程server build以及如何集成到CI工具進(jìn)行build,這里先繞過。我們在VS2015中編譯這個(gè)webapp,并且發(fā)布到publish目錄。然后,復(fù)制整個(gè)windows-docker-iis-demo目錄到這臺(tái)docker宿主機(jī)的C盤根目錄,以便進(jìn)行docker build。這個(gè)當(dāng)然不是build docker image的正常姿勢,只是因?yàn)槲覀冞€沒提到其他方式,我們先粗糙一點(diǎn),把它build出來,以便可以運(yùn)行。

在我們的Windows Server 2016機(jī)器上,打開一個(gè)administrator模式的powershell窗口,cd到c:\windows-docker-iis-demo目錄,然后執(zhí)行docker build命令制作image:

docker build -t iis-demo:1.0 .

編譯成功后,執(zhí)行docker images,可以看到多了一個(gè)iis-demo:1.0的docker image。接著,讓我們在宿主機(jī)的C盤創(chuàng)建一個(gè)temp目錄(為下面的volume使用,mount到容器內(nèi)部的iis日志),然后執(zhí)行下面的命令運(yùn)行一個(gè)iis-demo的docker instance:

docker run --ip 172.24.128.2 -p 80 -v 'c:/temp:c:/inetpub/logs/LogFiles' -e 'env1=LIVE1' -e 'env2=LIVE2' -e 'HOSTS=1.2.3.4:TEST.COM' iis-demo:1.0

這里的參數(shù)分別表示:

  • 指定容器ip=172.24.128.2

  • 允許80端口被外部訪問

  • 將容器內(nèi)的c:/inetpub/logs/LogFiles目錄mount到宿主機(jī)的c:/temp

  • 設(shè)置3個(gè)系統(tǒng)環(huán)境變量env1,env2,HOSTS

稍等片刻,等待容器實(shí)例運(yùn)行,然后在宿主機(jī)的瀏覽器中訪問,可以看到如下的內(nèi)容:

Hello Docker!Configuration:env1=LIVE1 (from appSettings in web.config)env2=Dev (from OS environment variable)Content of C:\Windows\System32\drivers\etc\hosts:1.2.3.4 TEST.COM

對(duì)比前面在開發(fā)環(huán)境運(yùn)行的結(jié)果,我們可以看到有一些有意思又詭異的區(qū)別:

  • 首先,通過前面的啟動(dòng)腳本SetHostsAndStartMonitoring.cmd讀取的環(huán)境變量env1和HOSTS都生效了;

  • 然而,在程序中運(yùn)行時(shí)讀取的環(huán)境變量env2沒有生效(這個(gè)好坑人??!意味著,無法直接在webapp中讀取docker run傳遞進(jìn)來的環(huán)境變量。一開始懷疑是因?yàn)閣ebapp的進(jìn)程啟動(dòng)時(shí)間早于docker run指定的環(huán)境變量生效的時(shí)間,但是即使進(jìn)到容器里recycle 對(duì)應(yīng)的apppool,還是不生效,具體原因有待后續(xù)驗(yàn)證了);

另外,在宿主機(jī)的c:\temp目錄,我們可以看到從容器實(shí)例寫道外部的iis log。

好了,看看至此我們已經(jīng)解決了哪些最開始提到的問題了:

  • 首先,我們實(shí)現(xiàn)了在docker run時(shí),指定不同的參數(shù),傳遞進(jìn)容器,比如覆蓋web.config中的設(shè)置,又比如,設(shè)置了額外的hosts文件中的dns解析;

  • 對(duì)于希望方便查看的日志,我們可以通過volume,mount到宿主機(jī)的目錄;

  • 同樣的,我們也可以mount應(yīng)用自己的數(shù)據(jù)到宿主機(jī),這樣容器實(shí)例重啟時(shí),應(yīng)用的狀態(tài)也能保持;

  • 因?yàn)榭梢栽赿ocker run時(shí)傳入?yún)?shù)被應(yīng)用讀取,我們可以用同一個(gè)docker image,在不同的環(huán)境(開發(fā)、測試、生產(chǎn))指定不同的參數(shù),比如,數(shù)據(jù)庫連接字串;

  • 網(wǎng)絡(luò)方面,關(guān)于如何從外部系統(tǒng)訪問容器內(nèi)部,我們會(huì)在后續(xù)篇章詳細(xì)討論,這里,因?yàn)榭梢詫⒆远xhosts傳遞進(jìn)容器,所以容器訪問外部系統(tǒng)的任何地址,都不用擔(dān)心無法解析;

應(yīng)該說,我們已經(jīng)解決了大多數(shù)前面提到但實(shí)例運(yùn)行時(shí)需要解決的問題了。然而,別忘了,這一篇里,我們只針對(duì)單服務(wù)器,單容器實(shí)例。在實(shí)際的部署案例中,是絕不允許單點(diǎn),無法擴(kuò)展的。

后面幾篇,我會(huì)展開講講這一篇跳過的一些非常重要的話題,例如網(wǎng)絡(luò)配置、遠(yuǎn)程管理、負(fù)載均衡、實(shí)時(shí)監(jiān)控、以及更高級(jí)的容器編排和集群實(shí)現(xiàn)等等,敬請(qǐng)期待!

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
淺嘗Windows Server 2016
inetpub是什么文件夾?這個(gè)文件夾可以刪除嗎?
群暉NAS安裝Docker容器版emby(zishuo版)
Docker-compose(多容器編排工具)
Dockerfile完全指南
基于boot2docker部署Docker環(huán)境
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服