Freigeben über


把 ASP.NET Core 應用程式裝進 Docker 裡 - 使用 Docker Tools for Visual Studio 2015

ASP.NET Core 1 (早期稱 ASP.NET 5) 是完全以跨平台與彈性開發為核心理念的 Web 開發平台,它能運行於 Mac 與 Linux 伺服器,同時也參考了其他開發平台的作法如 node.js 或 Python,將 Hosting 的引擎另外開發為 Kestrel Server,IIS 也不再是 ASP.NET Core 1 唯一的座騎。既然 ASP.NET Core 1 己經能跑在非微軟平台,那麼勢必也可以跑在容器環境內。

容器環境與 Docker 簡介

容器環境 (Container) 是這兩年來很熱的一門技術,它的正式名稱是作業系統層虛擬化 (OS-level Virtualization),屬於虛擬化技術的一支,它的原理是在作業系統核心內切割出使用者層級的環境,並且在每個使用者層級的環境內提供相同的 API。

這樣的作法看起來似乎和全虛擬化 (Full Virtualization) 很像,但全虛擬化採用的是作業系統使用者層級之上的行程,例如 Oracle 的 VirtualBox、Mac 上用的 Parallel Desktop、VMware Workstation 等都是跑在作業系統之上的使用者層級內的虛擬化軟體,用這種方式建立的虛擬機器,只要在別的作業系統上安裝相同的虛擬化軟體,虛擬機器就可以搬移過去。作業系統層虛擬化則是在作業系統核心內對使用者層級環境進行切割,作法是源自早期 Linux 上的 chroot 技術,只要能確保應用程式可以執行在該作業系統,就可以自由的把其上的應用程式移轉到別的電腦。

1 2

(source: https://www.docker.com/what-docker)

想想看,若是在一個電腦作業系統環境幾乎都相同的大型雲端環境,只要利用作業系統層虛擬化技術,所有的電腦都可以跑任何的應用程式,無形中會比伺服器級虛擬化 (Server Virtualization) 的強度更高,部署上只要作業系統具有作業系統層虛擬化能力,就不再需要像 Hypervisor 或是其他虛擬化軟體,只要由作業系統原生支援就足夠了。應用程式的開發人員只要有一個方法能將應用程式需要的軟體元件或框架等組織起來,再使用作業系統層虛擬化將軟體執行起來,由於作業系統層虛擬化的特性,每個使用者的環境都是獨立的,也就是說,各自的執行環境就如同一台又一台的虛擬機器一樣。

作業系統層虛擬化的實作,目前較廣為人知的是 Linux Container (LXC),它成功實作了在 Linux 作業系統內的虛擬化,但它本身只有 API 以核心引擎,在製作容器上需要較多的知識與實作經驗,因此就有其他團隊為 LXC 開發更簡易的管理套件,現在最火紅的容器管理軟體 — Docker —就是這樣的一個管理套件。Docker 將 LXC 容器技術再進一步封裝,讓建置容器變得更簡單,部署起來也更簡單,加上作業系統層虛擬化特性,讓一個應用程式能在數秒鐘之內執行起來,這在現今鼓吹 DevOps 流程的軟體產業來說相當重要 (因為可以放在任何一個作業環境上跑),也讓雲端供應商看到了比伺服器虛擬化更大的利基點,因此 Amazon 和 Microsoft Azure 都各自宣布大力支援以 Docker 為主的容器環境,Container 技術加上 DevOps 流程能讓應用程式的生命週期更迭再加快,而且運行速度也不會輸給伺服器級虛擬化的環境。

3

(source: Scott Hanselman, Publishing an ASP.NET 5 app to Docker on Linux with Visual Studio)

然而作業系統層虛擬化有個很大的缺點,就是它基於作業系統的核心進行使用者層級的虛擬化,因此只要作業系統核心不同,其上的應用程式就無法成功部署與執行,這對非 Linux 的作業系統是個很大的問題,因此像 Solaris 就開發了 Solaris Container;FreeBSD 開發了 FreeBSD jail 技術來支援作業系統層虛擬化。微軟雖然晚了一些,但現在正在開發的 Windows Server Container 以及 Hyper-V Container 技術也即將隨著 Windows Server 2016 的推出而正式亮相,藉時 Windows 上也可以使用容器技術了。

4

(source: Mike Neil, Microsoft Unveils New Container Technologies for the Next Generation Cloud)

程式化基礎建設

容器技術讓開發人員能使用相同的 API 群製作環境,以執行應用程式,這樣的特性使得開發人員能以程式碼的觀點來看待基礎建設,在一個大型雲端環境內,假設所有的機器上的作業環境 (不是作業系統) 完全相同,例如全部都是 Linux 作業系統且都支援 LXC 技術,那麼開發人員就不需要再關心其下的網路基礎建設,只要雲端環境本身能正常運作,開發人員就可以用程式碼去定義整個應用程式的環境。這樣的架構稱為程式化基礎建設 (Infrastructure as Code),只要使用程式碼或組態檔的作法就能定義應用程式所需的執行環境。當基礎建設能程式化,表示就能融進版控系統內,開發人員也不需要去深入了解基礎建設的架構與運作,只要使用組態檔來定義即可,團隊間也可以以相同的語言來溝通,這正是 DevOps 所強調的重點。

Docker 的容器介面抽象化,對於跨作業系統的容器管理而言就相當重要,這表示即使是不同的容器 (LXC/Windows Container) 也都能使用相同的 Docker API,減少因為作業系統容器技術不相容而造成的問題,對於具有多種作業環境的 Microsoft Azure 而言,Docker 的抽象化 API 幫助很大,所以 Microsoft Azure 在 Docker 上的投入也很大,Azure Container Service 是以 Docker 為主,並加上 Apache Mesos 的管理機制,結合容器技術與上層分散式系統管理能力,強化 Microsoft Azure 平台上的 DevOps 與容器應用能力。

使用容器技術所架構出的應用程式元件,又可以稱為微服務 (Microservice),表示輕巧又快速的軟體元件,它可以獨立存在又可以相依與其他的微服務,同時也能依需要自主擴展,在容器技術的支援下,幾乎能達到無極限的擴展力。Microsoft Azure 的下一代雲端服務 Service Fabric 就是基於微服務架構所提供的新雲端服務平台,開發人員可利用微服務的概念來開發與部署應用程式與服務。

將 ASP.NET 應用程式製成容器

前面花了這麼多篇幅介紹容器技術與其應用,相信會讓你有一股想試試看的衝動,現在我就拉回主題:Docker 與 ASP.NET,ASP.NET Core 1 既然可以執行在 Linux 上,也就表示我可以將它製作成容器,讓它可以執行在 Linux-based 的 Docker 環境內。當然,微軟的傳統就是使用 Visual Studio 就能做完一切,所以 Visual Studio 提供了 Docker Extension,在擴充功能與更新功能中搜尋 docker,就能找到這個工具。

5

這是一個要另外安裝的工具,所以下載並安裝後,打開 Visual Studio 再打開 ASP.NET Core 1 的專案 (若是 ASP.NET 4.x 則不行),然後呼叫發行視窗,可看到多了一個 Docker Container 的選項。

6

選擇 Docker Container 後,會出現選擇 Azure 上的 Docker VM 的對話盒。

7

按下 New 可新增新的 Docker Container VM,包含 Windows (Server Container Preview) 以及 Linux 的 VM,我選擇 Ubuntu Server 15.10,為了確定它確實可部署並執行在非 Windows 的平台。

8

額外佈建虛擬機器需要些時間,並可以在 Visual Studio 的輸出視窗看到進度。部署完成後再次啟動發行工具,可看到 Docker 部署的設定己經自動產生。

9

此時按下發行,Visual Studio 就會自動開始部署 ASP.NET Core 1 應用程式到遠端的 Docker Container VM 內,一樣在 Visual Studio 的輸出視窗能看到相應的動作。

10

在部署完成時,會開啟瀏覽器視窗,你可以看到 ASP.NET Core 1 應用程式己經能在 Docker Container 上執行了。

11

使用 Docker Client 指令可以進一步的確認它已經成功執行了。

12

Docker 是使用組態檔 Dockerfile 作為初始與啟動虛擬環境的基礎,Visual Studio Tools for Docker 會自動在專案內產生一個 Dockerfile 檔案,裡面是必要的 Docker 初始化的指令,包含要使用哪個 Docker Image (Docker 容器內的應用程式執行環境)、應用程式的來源、工作目錄以及要啟動的參數等,Docker 會依照它的定義來建立容器並啟動程式。

FROM microsoft/aspnet:1.0.0-rc1-final

ADD . /app

WORKDIR /app/approot

ENTRYPOINT ["./web"]

總結

本文將最近火紅的容器技術以及 Docker 做了簡單的介紹,並示範使用 Visual Studio Tools for Docker 部署 ASP.NET Core 1 應用程式到 Docker Container VM 內,以展示 Docker Container 部署與啟動的完整步驟。若你想要更深入研究 Docker 的作法,可搜尋網路上的 Docker 資源,未來 Microsoft Azure 會在 Docker 上有更多的支援,再加上 Service Fabric,雲端軟體開發的未來藍圖將會以容器技術與微服務為核心,此時不學,更待何時?

學習更多:

將 ASP.NET 容器部署到遠端 Docker 主機 使用 Docker VM 擴充功能來部署您的環境 佈建及管理大量 Container - Azure Container Service (ACS) ASP.NET Core Preview Docker Image