前端也應該了解點 docker 知識 (系列一 )
我覺著你是看了題目點進來的。前端和 docker 這倆八竿子打不著的有毛關系?那接下來我們就扯一扯,看看能不能把它倆扯一塊。
首先得達成共識,現在的前端已經不是以前的狹義的前端,如果指狹義的前端,那真是半毛錢關系都沒有。但你我不可否認的是,現在是大前端的時代。什么是大前端,詳細的應該大老板來給解釋下,但是這里還是簡單的去說一下:
- 前端有了 Node.js,擴展到了服務端的邊界,未來有更多的可能。
- 前端現在也逐漸的正規化,工程化,編譯,測試,發布逐漸完善。
- 我們是工程師,技術工種,拋開限定,多了解點技術豈不是更好。
看到這里,你可能心想,要是這么說,那確實可能是有那么一點關系。如果意識到這一點,我們已經成功拉近了 1/3 距離 。
其次,這篇(系列)文章還是定位 docker 的入門文章,即使不是前端的同學來看,也能對 docker 的架構,應用場景有個一定的了解,當你聽其它基友討論 docker 的時候,也能插上一嘴。
按照慣例,先來列個提綱或者叫先挖個坑:
- docker 的歷史和發展(系列一)
- docker 的理念與場景 (系列一)
- mac 上安裝 docker (系列二)
- docker 架構 (系列二)
- docker 重要命令簡介 (系列三)
- docker 實戰 (系列四)
- DokerFile 及最佳實踐
- docker-compose 等編排工具
- 網絡
- 存儲
- 集群
- 其它
1. docker 的歷史和發展
回顧下歷史及發展歷程也算是國際慣例了,docker 的發展也充滿著傳奇色彩。
當時,這個公司的名稱還是叫 dotCloud , 提供 Pass 服務,docker 是他們公司的一個內部項目。
2013 年 3 月 docker 正式發布開源版本。
上圖是 docker 的 GitHub commit 圖,看看是多么的活躍。還有那 27000+ 的星星。
后來 dotCloud 一看 docker 這么火,于是把公司名也改成了 docker 了。
一家公司玩終究玩不出大花樣來,而是一堆的國際巨頭型的公司的介入,大批的開發者提交代碼。
2013 年 11 月 RHEL 6.5 發布,集成了對 docker 的支持, 拉開了各大廠商競相支持 docker 的大幕。
2014 年 4 月開始,亞馬遜,谷歌,微軟在他們的云產品中已經開始支持 docker。
2014 年 6 月,DockerCon 2014 召開,谷歌, IBM , 微軟, 非死book, 推ter 等公司參與。于此同時 docker 1.0 正式發布。
…
2015 年 4 月, docker 完成了 D 輪 $9500w 融資。
而在國內,也是火的一塌糊涂,各個云廠商,各種大會,都能看到 docker 的身影。
2. docker 的理念
理念,往往是為解決痛點而生,就像 KISS(Keep it sample and stupid)為復雜程序而生一樣,docker 的理念是 build,ship, run。
2.1 build
好吧,作為前端這個單詞不陌生吧,你的項目目錄下面在幾天之前可能還有一個 build 目錄,現在接入 ff 進行云端 build,只是把 build 換了個地方。
按照前端的理解,build 就是編譯,打包的意思,和其它靜態語言如 c/c++ 之流一樣,在保證應用能跑起來之前所做的一些列動作。
常規的 build 有什么問題呢?它不能打包環境。
如果你有打包 rpm 的經歷,你可能清楚,你要區分系統的版本,cpu 的架構,從而打出特定平臺和系統下的軟件包。換句話講,你 build 一次只能跑在一個特定地方。
如果做過 Java 的同學可能清楚當年為啥 Java 會火起來,編寫一次,到處運行,就是因為 Java 有 JVM ,其實 docker 從某種角度看就屬于 JVM 的角色。
前端能不能做到 build 一次,各端運行呢?就要出現一個運行時的東西,屏蔽各端差異,從這種角度考慮,react 可能勉強算一個。
回到正題,docker 的 build 做了什么工作呢?
我們來看一下 docker build 的描述文件 DockerFile :
FROM centos:centos6 MAINTAINER yourname@example.com RUN yum -y update; yum clean all RUN yum -y install epel-release; yum clean all RUN yum -y install nodejs npm; yum clean all # copy 程序代碼到容器的/src 下 ADD . /src RUN cd /src; npm install EXPOSE 8080 CMD ["node", "/src/index.js"]
上面就是一個簡單的 Node.js 應用的 build 描述文件,docker 根據這個描述文件來 build 出來一個鏡像,一個可以到處運行的鏡像。
我們看一下第一個關鍵字 FROM , 它的意思是要從哪里作為基礎鏡像來制作你現有的鏡像。拿我們淘寶來講,我們假設有一個 Midway 的 docker 鏡像,這里面已經做好了運行 Midway 應用的所有環境準備,那么,你在開發,測試,線上,都可以使用同一個 Midway 的鏡像,如果你基于 Midway 的 4.0 版本,那你就 FROM Midway: 4.0 , 如果想用 5.0 就 FROM Midway: 5.0 。
那從上面 Midway 的例子來看,Midway 的鏡像就是包含了 Midway 的環境,不管你是 windows,mac,linux,只要是能用 docker,都能保證你的開發,測試,部署的環境的一致。這要是擱到以前呢?臥槽,Node.js 版本不對啊,環境變量不對啊,程序放的目錄不對啊,諸如此類環境不一致帶來的問題將一去不復返。
總結來講,docker 具有的這種能夠打包環境能力,是它能到處運行的關鍵。
2.2 ship
字面意思就是貨船,搬運,發布的意思。看看我們目前的發布機制,基本上是原理是,本機 git push 到 GitLab, 服務器上 git pull 。
從這點上來看和 docker 的異曲同工的。
把制作好的鏡像 docker push 到 dockerhub ( 致敬 GitHub ?) 或者私有 registry(你可以理解為 git 對應的 GitLab ),用戶通過 docker pull 到本地,同樣一會 pull 差異性的部分。這也是 docker 進行版本控制的一種方式
。
docker 擁有 dockerhub ,相較于程序員擁有 GitHub 一樣,是個大寶庫,這也是 docker 生態中很重要的一環。
但差異點在哪里呢?
傳統的發布只是把代碼或者程序發布到線上,如果不涉及類似 Node.js 版本升級,npm 模塊升級,環境變量更迭及其它代碼之外的的變更,其實是凸顯不出 docker 的優勢的。
docker 不僅分發鏡像,也可以分發鏡像的描述文件 DockerFile , 比如你想讓測試在你的環境里面去測試和復現 bug,不用提供個頭稍微大一些的鏡像,給他一個文本文件就好了。
所以 docker 的官網上也明確的說明了受益人是需要做應用分發的開發者和運維同學。
2.3 run
很好理解,就是運行的意思。
先來看看當前的程序運行模式。 對于傳統前端來講,把靜態文件放到 web 服務器的對應目錄就可以了,不涉及其它動作。對于 Node.js 類應用來講可能會復雜一點,不僅僅是把應用代碼發布上去就能生效,可能涉及到應用關停等影響服務可用性的動作。
那么 docker 的優勢體現在哪里?
- run anywhere , 也就是可以運行在任何可以運行 docker 容器的機器上。如果你的應用就是固定的兩臺設備,這體現不出 docker 的優勢,但如果你的應用分布在不同的地方,甚至不同的云服務上,都可以保證正常的秒級啟動。那這也給我們在突發流量的時候可以迅速實現擴容。
- 非常輕量,和傳統的進程沒太大差別,這也是相對于傳統的 vm 非常大的一個優勢。
- 資源隔離, 保證各個應用之間不相互影響,同時充分利用機器資源。
- 其它(各位可以自行補充)
2.4 總結
如果這么拆開了來分析其實對 docker 是不公平的,因為人家是 build, ship, run 提供的是一整套解決方案。
我們了解了 docker 的理念,反觀我們當前的開發,應用部署模式,docker 的應用場景有哪些?
- 需要重復配置統一的環境
- 一個團隊開發同一個程序,需要一致的開發環境,在之前你可能每個成員在自己電腦上配置一遍,但使用 docker 基本是配置一遍,其他同學共享就可以了
- 減少持續集成和測試的難度,我們清楚集成和測試的一大難點就是環境一致性問題
- 減少開發,測試,線上因為環境不一致而出現的問題的幾率
- 世界上有很多知名和成熟的鏡像,我們可以拿來用就可以了,提高效率
-
快速,高效利用當前資源
- 勤儉節約是中華民族的傳統美德,有時候一個容器就能完成的事情,我們申請一臺 vm,資源有些浪費。
- 生產一臺 vm 是分鐘級別的,而一臺容器卻是秒級的,這種優勢在大規模需要迅速實現擴容才會凸顯出來。
-
需要資源隔離的場景
- 比如一些多租戶的環境里面,一個用戶的失控比如程序把內存吃光,把帶寬打滿都是常有的事情,而 docker 就可以很好的在這些方面做好控制
-
需要快速動態的伸縮容量的場景
- 比如說大促,開始之前迅速擴容,結束之后迅速銷毀
-
微服務
- 這也是當前一個很火的話題
docker 的場景不僅僅是這些,以上僅僅是結合淘寶前端的現狀,YY 出來的一些可能的場景。docker 不是銀彈, 個人覺著就像我們對待 Node.js 一樣,在合適的場景合理的利用。
下期預告
在下一期里面我們的小明將會出場,通過一些問答的方式來描述下 docker 的架構相關的概念和理解,如下:
- Q 1: 我的筆記本是 mac ,為什么我安裝的時候還要裝 virtualbox ?
- Q 2: 原來如此,怪不得第一步先讓我 docker-machine 創建一個 vm 來跑 docker,那這個 docker-machine 是干什么的 ?
- Q 3: 你能解釋下 docker run hello-world , 都發生了什么?
來自: http://taobaofed.org/blog/2016/01/19/feders-should-kown-some-docker-1/