容器在“基礎設施即代碼(Infrastructure as Code)”中有什麼意義?
一句話概括的話,容器意味着一切。
為什麼這麼說呢?當你在比較單體應用和微服務時,一定會有一些權衡和取舍。一方面,從單體模型轉移到微服務模型,能夠将程序分離成獨立的工作單元。這使得開發者們可以将注意力放在單一功能上,并且有助于測試和擴充。另一方面,由于将所有的東西都分成了單獨的服務,過去你隻需管理一個單一部署單元的基礎設施,現在你卻必須管理每一個服務的基礎設施。正是為了應對這一挑戰,“基礎設施即代碼”作為一個解決方案便誕生了。
容器技術已經存在一段時間了,它以不同的形式實作且已取得不同程度的成功。這項技術從上世紀80年代初的chroot開始,并在之後帶來了如Virtuozzo和Sysjail這樣形式的産品。直到2013年Docker的誕生和其後的迅猛發展,一切才化零為整,才真正開始深刻影響了應用程式在容器模型中的開發、測試和部署。
“基礎設施即代碼”的實踐,和Docker容器一起,象征着一個最具颠覆性和創新性的改變,它影響了我們今天開發和釋出軟體的過程。
什麼是“基礎設施即代碼”(IaC)?
在深入探讨IaC及它和容器的關系之前,先看看IaC的具體含義吧。IaC指的是開發應用程式本身的同時,對硬體和作業系統需求的供應編寫腳本的實踐。通常,管理這些腳本的方式和軟體代碼庫類似,包括版本控制和自動化測試。
當正确執行時,腳本将代替管理者登陸新機器并進行配置。這些腳本描述了新機器的理想狀态,并會執行必要的步驟來配置機器,以實作這一狀态。
“基礎設施即代碼”帶來的核心便利
IaC旨在利用系統配置來緩解最常見的痛點,特别是以前配置一個新環境通常需要花費大量的時間。每一個環境都需要單獨配置,且如果某處出現錯誤,通常需重新進行整個過程。IaC消除了這些痛點,并向開發者和運維人員提供了以下額外的便利:
重新使用常見的腳本變得相對簡單了。
整個供應過程可實作自動化,連供應硬體都可以作為持續傳遞過程的一部分。
版本控制,可以根據需要測試和復原較新的配置。
同行審查和腳本強化。不需手動地從文檔或記憶體中配置,就可以對腳本進行審查、更新和持續改進。
文檔是自動的,因為本質上它就是腳本本身。
過程可以被測試。
容器,将“基礎設施即代碼”帶向新高度
作為開發者,我想我們都遇到過諸如“我不知道啊,反正它在我的機器上工作!”這樣的情況。往好處說,這是一種诙諧有趣的說法;但往壞處說,它代表了我們每天都要處理的一個很大的問題。Docker這一革新性的技術不僅有效消除了開發者的這些擔憂,它還使得IaC在開發過程中成為一個核心元件。
為了更好地說明這一點,讓我們想象一個已經Docker化的Web應用,它有簡單的UI界面。該應用将有一個類似于如下所示的Dockerfile,具體說明了包含該應用的容器的配置資訊。
<code>FROM ubuntu:</code><code>12.04</code>
<code># Install dependencies</code>
<code>RUN apt-get update -y && apt-get install -y git curl apache2 php5 libapache2-mod-php5 php5-mcrypt php5-mysql</code>
<code># Install app</code>
<code>RUN rm -rf /var/www/*</code>
<code>ADD src /var/www</code>
<code># Configure apache</code>
<code>RUN a2enmod rewrite</code>
<code>RUN chown -R www-data:www-data /var/www</code>
<code>ENV APACHE_RUN_USER www-data</code>
<code>ENV APACHE_RUN_GROUP www-data</code>
<code>ENV APACHE_LOG_DIR /var/log/apache2</code>
<code>EXPOSE </code><code>80</code>
<code>CMD [</code><code>"/usr/sbin/apache2"</code><code>, </code><code>"-D"</code><code>, </code><code>"FOREGROUND"</code><code>]</code>
如果你熟悉Docker,這是一個相當典型和簡單的Dockerfile,你應該已經知道了它是什麼。如果你不熟悉Dockerfile,那麼可以了解為,這個檔案将用于建立一個Docker鏡像,它本質上是一個用來建立容器的模闆。Docker容器建立完畢後,鏡像将用于建構容器,于是一個自包含的應用程式就這麼産生了。從開發工作站到高可用雲叢集,它可以在已經将其執行個體化的任何機器上使用。
我們看一下檔案中的幾個關鍵參數,并看看它們在過程中實作了什麼:
這一行是從Docker Hub中拉取一個Ubuntu Docker鏡像,作為新容器的基礎。Docker Hub是主要的Docker鏡像線上倉庫。如果你通路Docker Hub并在其中搜尋這個鏡像,你就能找到Ubuntu鏡像倉庫了。這是一個官方鏡像,是由Docker支援的專門團隊負責管理的。使用該鏡像的好處是,當你的底層技術出現問題時,很有可能已經有人開發出了修複更新檔并實作了它,并且你所需要做的隻是更新你的Dockerfile到新版本,重建你的鏡像,并再一次測試和部署你的容器。
Dockerfile中剩下的幾行将使用apt-get在基礎鏡像上安裝各種軟體包。将應用程式的源添加到/var/www目錄,配置Apache,然後将容器的公開端口設定為端口80。
最後,當容器搭建好後運作CMD指令,這将初始化Apache伺服器,打開它以接收http請求。
這是“基礎設施即代碼”最簡單的形式。這就是它的全部。
此時,假如你已經在工作站上安裝并運作Docker了,你可以從Dockerfile所在的目錄中執行以下指令:
<code>$ docker build -t my_demo_application:v0.</code><code>1</code>
Docker将為你建構鏡像,将其命名為my_demo_application并加标簽v0.1,v0.1實際是一個版本編号。鏡像建立後,您可以使用以下指令擷取該鏡像,并使用該鏡像建立容器。
<code>$ docker run -d my_demo_application:v0.</code><code>1</code>
就像這樣,你就可以在本地機器上運作你的應用程式,或者在你選擇的任何硬體上運作它。
結語
一份簡單的Dockerfile,可以檢查你的源代碼,指定應用程式的環境、配置和通路路徑,這就是Docker和“基礎設施即代碼”的最簡單形式。同時你可以使用docker compose來定義多層次服務的組合應用,每個服務都包含一個獨立的Dockerfile或者導入Docker倉庫的一個鏡像。你還可以使用docker compose的增強版本rancher compose,這是微服務部署利器,可以讓我們更加便利得玩轉rolling upgrade等進階特性。
本文轉自 RancherLabs 51CTO部落格,原文連結:http://blog.51cto.com/12462495/1904609