本文來自微信公眾號“給產(chǎn)品經(jīng)理講技術(shù)”(pm_teacher),歡迎大家關(guān)注。
最近聽了一期羅輯思維,聊的是《改變世界的箱子》,這個箱子就是集裝箱,它將物流運(yùn)輸過程標(biāo)準(zhǔn)化為以一個箱子為單元,簡化了運(yùn)輸流程,同時也降低了物流成本,因而造就了一個高度自動化、標(biāo)準(zhǔn)化和低成本的物流體系,極大的促進(jìn)了經(jīng)濟(jì)全球化。這讓我想到,最近在程序界也出現(xiàn)了同樣的一個箱子,那就是今天要聊的 Docker 容器。
軟件開發(fā)中需要面對的一個挑戰(zhàn)就是環(huán)境管理問題,因為軟件并不是獨(dú)立運(yùn)行的,它依賴了很多其它的軟件,包括操作系統(tǒng)、運(yùn)行時、依賴庫等等,而且對每個依賴軟件還有版本要求,有一個依賴關(guān)系稍微不對,那就可能造成軟件的運(yùn)行異常。產(chǎn)品同學(xué)應(yīng)該有過這種經(jīng)歷,從開發(fā)哥那里要一個最新版的軟件來體驗功能,結(jié)果裝在自己的電腦上打開就掛掉,這個時候找開發(fā)哥來解決,開發(fā)哥一看就會說 “哦,你這環(huán)境不對,換個 Win8 吧,這軟件只能在 Win8 以上運(yùn)行”,或者說 “這個軟件需要.Net 框架,你裝個.Net 就好了”。
其實(shí)解決依賴環(huán)境的辦法很簡單,那就是所有機(jī)器都用同一套環(huán)境。但是對于一些 web 服務(wù),它所依賴的軟件及關(guān)聯(lián)軟件可能有上百個,讓你去配一臺機(jī)器已經(jīng)要吐血了,如果讓你把這個服務(wù)發(fā)布到 100 臺不同的機(jī)器上,那么你就應(yīng)該會陣亡了。同時,很有可能因為不同的機(jī)器已有的環(huán)境不同,你安裝這些依賴的同時還要保證不能影響其它已有應(yīng)用。
說了這么多,其實(shí)就是三個大問題,如何解決環(huán)境依賴?如何解決大規(guī)模部署?如何解決應(yīng)用與應(yīng)用的互相影響?Docker 就是這些問題的一種解決方案,它是一個容器,也可以說是一個軟件集裝箱,這個箱子里面可以塞入特定版本的操作系統(tǒng)、數(shù)據(jù)庫、服務(wù)器程序和 web 應(yīng)用,這樣一套完整的 web 服務(wù)就集成在這個箱子里面了,當(dāng)要發(fā)布服務(wù)的時候,直接將這個集裝箱放在我們的服務(wù)器船上。如果你想發(fā)布到 100 臺機(jī)器上,沒問題,只需要 ctrl-c ctrl-v,將這些集裝箱復(fù)制到 100 臺機(jī)器上,它不會在乎船的配置高低,只要能放得下就行。如果你想發(fā)布 10 個不同的服務(wù),還是沒問題,你只需將這 10 個不同的集裝箱依次排列在服務(wù)器船上,它們之間完全不會互相影響,因為各自被鎖在不同的箱子里。
有的同學(xué)可能會說了,這不就是虛擬機(jī)嘛...是的,Docker 算是一種輕量級的虛擬機(jī),它比起傳統(tǒng)的虛擬機(jī)更快,更節(jié)省資源。打個比方,虛擬機(jī)就是輪船上的豪華包間,即使它用不了這么多資源,它也霸占著不讓別人使用,而 Docker 容器就是一個簡單的集裝箱,它只占據(jù)它需要的資源。
Docker 技術(shù)目前才剛剛開始流行,它能不能改變程序世界,讓我們拭目以待吧。