容器在「基礎設施即代碼(Infrastructure as Code)」中有什麼意義?php
一句話歸納的話,容器意味着一切。mysql
爲何這麼說呢?當你在比較單體應用和微服務時,必定會有一些權衡和取捨。一方面,從單體模型轉移到微服務模型,可以將進程分離成獨立的工做單元。這使得開發者們能夠將注意力放在單一功能上,而且有助於測試和擴展。另外一方面,因爲將全部的東西都分紅了單獨的服務,過去你只需管理一個單一部署單元的基礎設施,如今你卻必須管理每個服務的基礎設施。正是爲了應對這一挑戰,「基礎設施即代碼」做爲一個解決方案便誕生了。git
容器技術已經存在一段時間了,它以不一樣的形式實現且已取得不一樣程度的成功。這項技術從上世紀80年代初的chroot開始,並在以後帶來了如Virtuozzo和Sysjail這樣形式的產品。直到2013年Docker的誕生和其後的迅猛發展,一切才化零爲整,才真正開始深入影響了應用程序在容器模型中的開發、測試和部署。sql
「基礎設施即代碼」的實踐,和Docker容器一塊兒,象徵着一個最具顛覆性和創新性的改變,它影響了咱們今天開發和發佈軟件的過程。docker
在深刻探討IaC及它和容器的關係以前,先看看IaC的具體含義吧。IaC指的是開發應用程序自己的同時,對硬件和操做系統需求的供應編寫腳本的實踐。一般,管理這些腳本的方式和軟件代碼庫相似,包括版本控制和自動化測試。apache
當正確執行時,腳本將代替管理員登錄新機器並進行配置。這些腳本描述了新機器的理想狀態,並會執行必要的步驟來配置機器,以實現這一狀態。ubuntu
IaC旨在利用系統配置來緩解最多見的痛點,特別是之前配置一個新環境一般須要花費大量的時間。每個環境都須要單獨配置,且若是某處出現錯誤,一般需從新進行整個過程。IaC消除了這些痛點,並向開發者和運維人員提供瞭如下額外的便利:服務器
做爲開發者,我想咱們都遇到過諸如「我不知道啊,反正它在個人機器上工做!」這樣的狀況。往好處說,這是一種詼諧有趣的說法;但往壞處說,它表明了咱們天天都要處理的一個很大的問題。Docker這一革新性的技術不只有效消除了開發者的這些擔心,它還使得IaC在開發過程當中成爲一個核心組件。app
爲了更好地說明這一點,讓咱們想象一個已經Docker化的Web應用,它有簡單的UI界面。該應用將有一個相似於以下所示的Dockerfile,具體說明了包含該應用的容器的配置信息。運維
FROM ubuntu:12.04 # Install dependencies RUN apt-get update -y && apt-get install -y git curl apache2 php5 libapache2-mod-php5 php5-mcrypt php5-mysql # Install app RUN rm -rf /var/www/* ADD src /var/www # Configure apache RUN a2enmod rewrite RUN chown -R www-data:www-data /var/www ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 EXPOSE 80 CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
若是你熟悉Docker,這是一個至關典型和簡單的Dockerfile,你應該已經知道了它是什麼。若是你不熟悉Dockerfile,那麼能夠理解爲,這個文件將用於建立一個Docker鏡像,它本質上是一個用來建立容器的模板。Docker容器建立完畢後,鏡像將用於構建容器,因而一個自包含的應用程序就這麼產生了。從開發工做站到高可用雲集羣,它能夠在已經將其實例化的任何機器上使用。
咱們看一下文件中的幾個關鍵參數,並看看它們在過程當中實現了什麼:
FROM ubuntu:12.04
這一行是從Docker Hub中拉取一個Ubuntu Docker鏡像,做爲新容器的基礎。Docker Hub是主要的Docker鏡像在線倉庫。若是你訪問Docker Hub並在其中搜索這個鏡像,你就能找到Ubuntu鏡像倉庫了。這是一個官方鏡像,是由Docker支持的專門團隊負責管理的。使用該鏡像的好處是,當你的底層技術出現問題時,頗有可能已經有人開發出了修復補丁並實現了它,而且你所須要作的只是更新你的Dockerfile到新版本,重建你的鏡像,並再一次測試和部署你的容器。
Dockerfile中剩下的幾行將使用apt-get在基礎鏡像上安裝各類軟件包。將應用程序的源添加到/var/www目錄,配置Apache,而後將容器的公開端口設置爲端口80。
最後,當容器搭建好後運行CMD指令,這將初始化Apache服務器,打開它以接收http請求。
這是「基礎設施即代碼」最簡單的形式。這就是它的所有。
此時,假如你已經在工做站上安裝並運行Docker了,你能夠從Dockerfile所在的目錄中執行如下指令:
$ docker build -t my_demo_application:v0.1
Docker將爲你構建鏡像,將其命名爲my_demo_application並加標籤v0.1,v0.1實際是一個版本編號。鏡像建立後,您可使用如下命令獲取該鏡像,並使用該鏡像建立容器。
$ docker run -d my_demo_application:v0.1
就像這樣,你就能夠在本地機器上運行你的應用程序,或者在你選擇的任何硬件上運行它。
一份簡單的Dockerfile,能夠檢查你的源代碼,指定應用程序的環境、配置和訪問路徑,這就是Docker和「基礎設施即代碼」的最簡單形式。同時你可使用docker compose來定義多層次服務的組合應用,每一個服務都包含一個獨立的Dockerfile或者導入Docker倉庫的一個鏡像。你還可使用docker compose的加強版本rancher compose,這是微服務部署利器,可讓咱們更加便利得玩轉rolling upgrade等高級特性。
9月27日,北京海航萬豪酒店,容器技術大會Container Day 2017即將舉行。
CloudStack之父、海航科技技術總監、華爲PaaS部門部長、恆豐銀行科技部總經理、阿里雲PaaS工程總監、民生保險CIO······均已加入豪華講師套餐!
11家已容器落地企業,15位真·雲計算大咖,13場純·技術演講,結合實戰場景,聚焦落地經驗。免費參會+超高規格,詳細議程及註冊連接請戳