在Linux中使用Docker容器部署ASP.NET 5應用程序
本文的作者是微軟的Azure平臺的工程師,去年年底微軟就宣布開源.Net核心運行時,并與Mono合作以推進.Net在Linux等非Windows 平臺的移植。同時,微軟也宣布將在新一代的Windows服務器上支持Docker,支持容器化部署,這讓我們看到了微軟擁抱開源的決心。本文介紹了如何 在Linux中使用Docker容器部署基于ASP.NET 5的應用程序。
作為ASP.NET 5跨平臺部署實現的一部分,我們正在為簡化ASP.NET應用部署、兼容Linux或者Mac OS X等操作系統運行而努力工作。最近,我們發布了首個ASP.NET的Docker鏡像: ASP.NET 5預覽版Docker鏡像。
Docker是一個開源的項目,目的是在Linux操作系統下輕松的以沙箱 的方式運行應用程序。當你下載了ASP.NET 5的Docker鏡像,你就有了一個能夠運行ASP.NET 5應用程序的Linux環境;現在你所要做的僅僅是在這個鏡像中添加你的應用程序,然后啟動一個容器,運行它,發布它。
本教程中我們為你展示如何在微軟Azure云上利用Docker在Linux操作系統中部署一個使用ASP.NET 5預覽版編寫的簡單的Web應用程序。這個教程中的例子可以在Linux、Mac OS X或者所有能裝Docker客戶端的操作系統下運行(如果喜歡,你也可以遠程登錄Linux虛擬機運行)。當然,當你安裝了Docker的Windows 客戶端,你就能在Windows上運行本文中的例子。以后,如果Window Server支持容器化部署了,你就能使用Docker在Windows Server中來管理Windows Server的容器了。
注:文中所有的演示流程與代碼都是基于ASP.NET 5(vNext)預覽版的,在正式發布后運行的方式可能會有所不同。所以,到時候如果讀者需要知道如何使用Docker部署ASP.NET 5的應用程序,還請自行登陸ASP.NET 5的 Docker Hub頁面或者 GitHub倉庫去參看最新的部署文檔。
第一步:創建運行環境
現在Docker還只能在Linux上運行,所以你必須找一臺Linux機器或者裝了Linux虛擬機的機器來運行Docker;你在 這里可以找到Docker的安裝步驟或者通過參考這篇文章 Getting Started with Docker On Azure(在Azure云端安裝Docker的起步教程)。當然你可以從Azure云獲取一個安裝好Docker的Linux虛擬運行環境。這個教程假設你已經在Azure上有了安裝好Docker的Linux虛擬機。如果你擁有其它類似的運行環境,那這個教程也是可以使用的。
第二步:為你的ASP.NET 5應用創建一個Docker鏡像
為了能讓ASP.NET應用程序在云端部署,你需要一個Docker鏡像來承載你的應用。Docker鏡像的文件系統是層疊式的(AUFS文件系統),可以這樣形象的理解:你的應用程序只是“基礎鏡像”上層新加的一個層而已(譯者注:就像蓋房子一樣,新增的樓層是基于它下面的樓層建立起來的),而在我們的例子中“基礎鏡像”為 microsoft/aspnet(譯 者注:這是一個Docker鏡像的名稱,這個鏡像存在于Docker Hub中)。在Docker中鏡像的層級是增量疊加起來的(譯者注:這點跟Git原理一樣),Docker保存了每個層之間的差異,所以當我們用 Docker部署應用時,提交的更新不會包含Linux發行版內核或者ASP.NET的運行時,因為這些都已經存在于“基礎鏡像”中了,你只會提交基于此 “基礎鏡像”構建的應用程序本身,所以Docker的這種差異化提交、部署機制能夠確保應用程序以最快速、最小化的增量方式進行部署,為運維帶來極大的便 利。
如何創建Docker鏡像呢?答案是使用:Dockerfile。跟Makefile相似,Dockerfile包含了供Docker用來構建一個鏡像的所有步驟。
本教程所用到的ASP.NET源代碼可以從GitHub的 aspnet/Home倉庫下的 HelloWeb目錄提取。首先,使用如下命令將源代碼從GitHub上克隆下來:
git clone git@github.com:aspnet/Home.git aspnet-Home
切換到aspnet-Home的sample目錄下:
cd aspnet-Home/samples/HelloWeb
完成后目錄結構應該如下所示:
├── Startup.cs ├── image.jpg └── project.json
然后我們在此目錄下創建一個名叫Dockerfile的文件,并輸入如下指令:
FROM microsoft/aspnetCOPY . /app WORKDIR /app RUN ["kpm", "restore"]
EXPOSE 5004 ENTRYPOINT ["k", "kestrel"]</pre>
讓我們逐條解釋此Dockerfile中命令的含義:
- 第一行中FROM命令后面的‘microsoft/aspnet’說明我們要下載Docker Hub中名為‘microsoft/aspnet’(此鏡像也是ASP.NET在Docker Hub上的官方鏡像)的鏡像作為我們例子程序的“基礎鏡像”;
- COPY命令告訴Docker在構建鏡像的時候同時將當前目錄(譯者注:.表示當前目錄)下的所有文件(譯者注:Startup.cs、image.jpg與project.json這三個文件)拷貝到容器的/app目錄下;緊接著,使用WORKDIR命令告訴Docker將容器啟動目錄設置為/app目錄;
- RUN [kpm, restore]命令告訴Docker運行kpm restore命令安裝ASP.NET相關依賴項,這些都是Docker在第一次運行此容器之前要做的準備工作;
- EXPOSE 5004命令會告訴Docker正在構建的鏡像有個監聽5004號端口的服務(可以查看project.json文件確認)(譯者注:意思是以此鏡像為基礎運行的容器需要向外暴露5004號端口);
- 最后,ENTRYPOINT [k, kestrel]命令說明每次用Docker啟動此容器時都會自動執行k kestrel命令,同時通過運行此命令保證容器始終在運行不退出,其實kestrel命令就是啟動了ASP.NET 5的服務器,啟動此服務器后會啟動一個監聽5004號端口的進程,處理HTTP連接請求。(譯者注:這就是為什么要向外暴露5004號端口的原因。) </ul>
第三步:創建鏡像
當我們編寫完Dockerfile后,當前目錄應該是如下結構,Dockerfile和程序源代碼在一起:├── Dockerfile ├── Startup.cs ├── image.jpg └── project.json
現在我們來創建此Docker鏡像。這個過程非常簡單——運行Docker的build命令即可,命令如下:
docker build -t myapp .
這條命令運行結束后Docker就生成了一個名為myapp的鏡像;同時,你對鏡像所做的任何變化都能通過重新運行此命令來生成一個新的鏡像。在你的Linux虛擬機或者開發環境中運行docker images命令可以看到我們剛剛創建的myapp鏡像了:
$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE myapp latest ccb7994d2bc1 39 seconds ago 499.8 MB microsoft/aspnet latest 16b1838c0b34 12 days ago 473.4 MB
你可以看到你的應用鏡像以及ASP.NET鏡像都存在于你的主機上。
現在我們開始講如何將ASP.NET應用程序部署到云端。
第四步:運行容器
運行一個容器非常的簡單,通過運行以下命令可以在你的開發機上啟動myapp容器:docker run -t -d -p 80:5004 myapp
- -t表示附加一個偽終端(tty)到容器(在以后的ASP.NET 5版本中可能不在需要);
- -d表示以后臺的方式運行容器,如果不使用此標識的話,ASP.NET運行時后臺的輸入/輸出流信息就會顯示在你的終端上;
- -p 80:5004告訴Docker將容器的5004號端口映射到宿主機的80號端口上。這樣,宿主機80號端口接收的數據包就會被轉發到容器的5004號端口上了;
- 最后,myapp是鏡像的名稱,我們可以用這個名稱來啟動之前Dockerfile構建的鏡像。
容器啟動之后(譯者注:容器和鏡像的區別就相當于OO中的對象和實例,對象是編譯時的概念,實例是運行時的概念。以這樣理解,容器是運行時的鏡像。),可以通過以下命令查看容器運行的狀態:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f70bd9ffbc36 myapp:latest "/bin/sh -c 'k kestr About a minute ago Up About a minute 0.0.0.0:80->5004/tcp mad_goodall
好的,容器啟動了!但是我們的演示還沒結束,我們還要完成Azure VM的終端端口映射(endpoint port mapping for Azure VM)。你必須到Azure云的管理頁面將Linux虛擬機(容器的宿主機)的80號端口映射到公網的TCP 80號端口上(具體可以參考這個教程)。
好了,現在我們在瀏覽器中打開http://your-cloud-service-name.cloudapp.net:80/ </li> </ul>
看!我們已經在Linux中使用Docker容器運行ASP.NET 5的應用程序了!(譯注:屌炸了!)
當然,如果你要構建一個比我們演示程序更復雜的業務系統,你需要學會編寫Dockerfile來構建更加復雜的鏡像,你可以參考 這里。
結論
我們會持續為ASP.NET 5能更好的運行在Linux的Docker容器中而不斷的努力、投入;同時,我們很高興為你帶來微軟在Docker Hub上的首個官方鏡像: ASP.NET 5 Preview Image.
當然,本教程依賴預覽版的ASP.NET 5與預覽版的Docker鏡像,所以隨著時間與開發進度的推進,本文的指令可能會過時。所以讀者可以通過登錄 Docker Hub或者 GitHub倉庫來獲取最新的鏡像與程序版本。
你也可以在 GitHub上給我們反饋,以幫助我們改善Docker鏡像與ASP.NET 5。
原文鏈接:Running ASP.NET 5 applications in Linux Containers with Docker(翻譯:肖勁 審校:李穎杰)
來自:http://dockerone.com/article/164