Docker4Dev #6 使用 Windows Container 运行.net应用
關于d4d系列:之前這個系列叫做docker4dotnet,因為當時主要是為了能夠探索在docker上運行.net應用;現在我覺得應該叫做docker4developer,因為我希望能夠幫助更多的開發人員使用docker技術。今天這篇就算是新的Docker4Dev系列的開始,后續我會陸續發布更多的幫助開發人員使用容器的文章。
隨著 Windows Server 2016 的正式發布,Windows Container也可以被部署到生產環境了。Linux Container存在的時間很久了,但是直到2013年Docker的出現我們才有了一種很簡單的方式來使用Container技術,而在Windows平臺上,類似的Container技術其實也存在很長時間了,但是由于Windows本身的一些特點,我們一直很難(就算經過復雜的配置)使用類似Linux Container的完整應用級別的隔離。這其中的原因我個人覺得主要是因為Windows的封閉性,造成社區無法按照自己的要求對其進行改進。2013年Docker發布后,對整個IT市場造成的沖擊巨大,微軟同樣也感受到了威脅,對于Container技術的追趕也隨即開始,讓人感到欣慰的是,微軟這次沒有再次采用閉門造車的方式,而是采用了更加開放的方法與社區合作,接受社區中已有的工具和方法;Windows Container對于Docker工具鏈的良好支持就說了這一點。
因此,如果你熟悉Docker,那么這篇文章的內容對你沒有什么新奇之處;但是如果你像我一樣是個在Windows平臺上工作多年的開發人員,就會發覺其中的好處。
你需要怎樣的環境?
首先,搭建一個可以運行 Windows Container 的環境有3個選擇:Windows Server 2016, Windows 10 和 Nano Server。另外,你需要了解 Windows Container 有2種不同的運行模式:Windows Server Container 和 Hyper-V 模式。這其中的區別請見下圖:
其實在我們運行的時候,你是感覺不到其中的區別的,你仍然使用熟悉的 docker run 命令來啟動容器,不過操作系統會根據上面表格所列自動的選擇當前平臺上的默認Container類型運行你的容器。
如果你希望嘗試 Windows Container, 最簡單的方式就是安裝 Windows 10 (專業版或者企業版),然后安裝 Docker for Windows 的工具。具體方法可以參考:https://docs.docker.com/docker-for-windows/
這里我準備了一個簡單的PowerShell腳本,直接運心就可以完成啟用Windows 10上的Container和Hyper-V功能,由于Windows 10只能運行Hyper-V Container,所以一定需要打開這個功能才可以。
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All Enable-WindowsOptionalFeature -Online -FeatureName containers -All Restart-Computer -Force用Docker支持傳統 .net 開發
之所以說“傳統”,這主要是為了和 .net core做區分,因為.net core本身是跨平臺的,所以完全可以使用 Linux Container 來運行(具體請見之前的d4d系列文章),也就不需要 Windows Container 的支持,當然你也可以使用 Windows Container 來運行 .net core,這完全沒有問題。但是我覺得大多數 .net 開發人員還是更加關心自己的 .net 2.0/3.5/4.5 應用如何使用 Container。
在配置好以上所需要的開發環境之后,你就可以用 Visual Studio 進行傳統.net應用的開發,并用docker完成Windows Container的鏡像打包和運行了。只是有一點,你需要將你的Docker for Windows 工具切換到 Windows Container的支持上才行。
一旦完成了切換,你用 docker 所做的所有操作就都轉向 Windows Container 了。(注:這其實只是現在的一個折中做法,未來的 docker 工具一定是可以同時操作 Windows 和 Linux 兩種 Container 類型的)。
首先我們用 Visual Studio 2017 來創建一個 asp.net 4.5的應用程序,然后F5運行一下,確保程序可以正常啟動。
現在,我們來添加一個Dockerfile,為了區分我把它命名為 Dockerfile.windows
以下是這個Dockerfile.windows的內容
FROM harbor-bj.devopshub.cn/microsoft/iis SHELL ["powershell"]RUN Install-WindowsFeature Net-Framework-45-ASPNET ; \Install-WindowsFeature Web-Asp-Net45ARG source=. WORKDIR 'c:\app'RUN Remove-Website -Name 'Default Web Site' RUN New-Website -Name 'aspnet45docker' -Port 80 \-PhysicalPath 'c:\app' -ApplicationPool '.NET v4.5'EXPOSE 80 COPY $source .注意幾點:
1. 為了能夠更快的下載基礎鏡像,我這里使用了LEANSOFT在北京的harbor站點;這里我已經預先同步了Docker Hub上的基礎鏡像。
2. 建議大家先預先下載這個基礎鏡像,因為 Windows 的基礎鏡像都很大 (WindowsServerCore 有4個G,NanoServer也有400M)
3. 這個Dockerfile中使用了 PowerShell 作為腳本引擎,所以后續你看到的命令都是 PowerShell 命令,比如: Install-WindowsFeature, New-Website 等等。
說實話,這個Dockerfile寫得很順手,畢竟之前對PowerShell的熟悉程度還是超過了shell script,這可能是 Windows 開發人員的好消息。
現在你就可以用熟悉的方式“發布站點”到本地文件夾,然后在里面進行 docker build 了,為了保證這個Dockerfile.windows可以被正常的復制到發布站點中,我還添加了一個Post-Build 腳本,確保每次發布都自動復制這個Dockerfile.windows 文件。
在發布完成的目標目錄內運行以下命令就可以打包了
docker build -f Dockerfile.windows -t aspnet45web01:win-v1 .好了,現在啟動Container
docker run -itd -p 81:80 aspnet45web01:win-v1進行到這里,用過 Docker for Windows 的同學一定會打開瀏覽器 http://localhost:81 來訪問站點,但是你啥也看不到;這是因為 Docker for Windows 對 Windows Container 的支持還不夠完整,沒有進行 localhost 的自動映射,所以你需要使用 docker inspect 來獲取容器的 ip 地址,然后通過 ip地址直接訪問。
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" <container id>打開以上命令獲取的ip地址,注意不要用 81 端口,而使用容器本身的80端口,因為我們是直接對容器進行訪問?,F在你就可以看到一個傳統的.net 4.5應用運行在 Windows Container中了,如果你注意看了我的 Dockerfile,你就知道這個站點實際是跑在 IIS 上面的。
一點感受
Windows Container雖然已經可以投入生產了,但是就和 Docker 剛剛出現時一樣存在一些問題,最大的問題是鏡像文件太大。上面說了,WindowServerCore鏡像4個G,這確實是有點夸張。我覺得微軟的目的是為了能夠用同樣的鏡像同時支持Windows Server Container和Hyper-V Container,畢竟Hyper-V Container是作為一個VM存在的,用一個完整的操作系統鏡像就可以同時在2中模式上運行,這樣當然是有好處的,因為大家不用考慮不同的運行模式而改用不同的基礎鏡像。但是我覺得從技術上,如果采用 Windows Server Container,微軟應該是可以提供非常小的基礎鏡像,類似 docker 提供的空鏡像,這樣對第一次部署容器會有很大的性能提升。
但是話說回來,當你第一完成一個容器部署后,因為基礎鏡像已經存在,每次更新的數據就只有很小的部分(只是應用程序本身),這樣后續的部署速度還是很快的。
另外,對于Hyper-V Container的存在的目的,我覺得除了可以提供更好的容器隔離能力(因為是VM,所以根本就是2臺機器,不存在共享內核的問題),另外一個重要的目的就是在Windows平臺上支持Linux Container的運行。希望微軟的動作可以更快一點,畢竟你有全球最好的開發人員,沒有什么是技術上做不到的。
相關文章:
docker4dotnet #1 – 前世今生 & 世界你好
docker4dotnet #2 容器化主機
docker4dotnet #3 .net猿和小鯨魚的蘋果山之旅
docker4dotnet #4 使用Azure云存儲搭建高速 Docker registry
docker4dotnet #5 使用VSTS/TFS搭建基于容器的持續交付管道
推薦一個培訓
【基于Docker的DevOps實戰培訓】是由徐磊老師主講的三天封閉式收費課程,地點北京,時間2017年03月24-26日。課程結合了徐磊老師多年來在DevOps上的實踐經驗和Docker技術,具有很強的實戰意義。詳細內容及報名方式點擊“閱讀原文”。
內容轉載自公眾號
DevOps 了解更多總結
以上是生活随笔為你收集整理的Docker4Dev #6 使用 Windows Container 运行.net应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .Net大户的选择:Windows Co
- 下一篇: Windows 容器