乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       louis2010 2019-03-11

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

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

      要正確部署一個iis應(yīng)用到Windows Server Docker,并不是表面那么簡單。限于篇幅,并且為了更專注,本文先不涉及容器編排、負(fù)載均衡、images的構(gòu)建和管理等問題(這些要考慮的問題還有很多,以后我們單獨(dú)聊),這里只關(guān)注如何將一個基于iis的應(yīng)用正確運(yùn)行于單個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í)例重啟時,如何保證被部署的應(yīng)用能保持之前的工作狀態(tài),能繼續(xù)服務(wù);

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

      應(yīng)用示例

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

      這個應(yīng)用只包含一個頁面,在我本機(jī)運(yùn)行時,顯示類似下面的內(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中添加對應(yīng)的iis-demo應(yīng)用;

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

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

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

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

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

      docker build -t iis-demo:1.0 .

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

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

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

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

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

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

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

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

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

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

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

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

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

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多