1. 程式人生 > >docker在web開發中得使用流程是怎樣的?

docker在web開發中得使用流程是怎樣的?

來源於知乎:


作者:知乎使用者
連結:https://www.zhihu.com/question/51134842/answer/124450760
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

最近做過一個專案使用了Docker,下面我拋磚引玉,談一下自己對Docker的理解。
在解答題主的問題之前,我們先搞清楚下面三點:
一、為什麼使用Docker
二、使用Docker的正確姿勢
三、Docker帶來了哪些好處

一、為什麼使用Docker
Docker一詞意為碼頭工人,而Docker的功能也與集裝箱類似。通常一個webapp並不會用到作業系統/虛擬機器的全部功能,即作業系統/虛擬機器對於一個webapp來說太過笨重。打個比方說,我要從宿舍去食堂,我並不需要一架飛機,只需要一輛自行車就夠了,而Docker映象就相當於是一輛自行車。你可以把Docker映象理解為輕量化的虛擬機器,當然二者有所不同,但是不在本文的討論範圍。

二、使用Docker的正確姿勢
設想一個如下場景:
我們需要一個webapp,其功能是使用者註冊並將註冊資訊插入到資料庫,環境為Ubuntu+Tomcat+Mysql,怎麼做?
不使用Docker的話,我們通常會這樣做,以Ubuntu為作業系統,然後安裝Tomcat和MySQL,最後把app部署上就可以了。那麼使用Docker會怎麼做呢,在這個場景下,可以有兩種方式:
1.仍然以Ubuntu為作業系統,然後構建一個安裝有MySQL和Tomcat的Docker映象,並把app部署到其中,最後啟動Docker映象就可以了。看起來好像和不使用Docker基本相同,甚至還要麻煩一些,是這樣嗎?彆著急,繼續往下看。
2.第二種方式則體現了Docker的"每個容器只做一件事情"的思想,我們構建兩個映象,一個僅安裝Tomcat並部署我們的app,另一個僅安裝MySQL,然後啟動這兩個映象,得到兩個容器,再利用Docker的容器互聯技術將二者連線(Docker的容器是通過http連線的)。

三、Docker帶來了哪些好處
看完上面的例子,你可能仍然不會覺得Docker有什麼好處,其實真正使用了Docker之後,你會覺得簡直愛不釋手。粗略來說,Docker好處有:
1.保證了線上線下環境的一致性
我們線上下的開發環境使用Docker構建好weaapp的映象後,可以直接在線上使用一個映象,保證了線上線下環境的一致性,再也不會有線上下開發環境中執行正常,而部署到線上各種錯誤了。
2.極大的簡化了webapp的部署流程
在不使用Docker時,我們部署app時,要先搭建好app執行所需環境,這個過程做過的人都知道多麼枯燥繁瑣,一不小心還出錯。而有了Docker,我們只需要直接構建一個我們webapp的映象然後將其執行即可,無論在多少臺伺服器中部署,都是如此。再比如,使用Docker之前要搭建一個WordPress對於新手來說是有些困難的,而有了Docker,只需要從DockerHub上pull一個WordPress映象並啟動就可以了,非常非常方便。
3.實現了沙盒機制,提高了安全性
由於webapp執行在容器中,與作業系統隔離開了,從而使作業系統基本不可能受到破壞,另外如果webapp因為攻擊而癱瘓,並不需要重啟伺服器,直接重啟容器或者再啟動一個映象就可以了。
4.實現了模組化,提高了複用性
在二中使用Docker的第二種方式就可以看出,我們將資料庫和Tomcat執行在不同的容器中,從某種角度來說,這也降低了模組之間的耦合性,便於拓展。比如我們要把MySQL替換為oracle,只需要再構建一個oracle映象並啟動與Tomcat連線即可,非常方便。對於我們構建的映象,在其他app中直接拿來用就可以了,不必重複勞動。
5.實現了虛擬化,提高硬體利用率
有了Docker,我們可以在一臺伺服器上執行很多webapp,充分利用閒置資源。這時候,伺服器的作業系統就類似於貨輪,而一個個Docker容器就相當於貨輪上的一個個集裝箱。現在大熱的雲服務市場,不少就用了Docker。舉個例子來說,現在我們有一臺作業系統為Ubuntu14.04的伺服器,我們構建不同版本的ubuntu映象並啟動,並且為不同的使用者分配不同的容器。這樣,用一臺伺服器
可以虛擬出n個執行著不同作業系統的虛擬伺服器,而對於使用者來說,這些是透明的––使用者則認為自己擁有一臺完整的伺服器。據我推測,阿里雲的伺服器就是這麼幹的。這充分利用了閒置的硬體資源。

我這裡掛一漏萬,Docker的好處遠遠不止這些。譬如使用Docker映象實現磁碟快照功能,在不同場景下有Docker不同的使用姿勢,至於更多奇技淫巧,則需要在使用過程在去發掘。

囉嗦了這麼一大堆,接下來回答題主的問題。實際上很多問題前文都已經解答了。

Docker的容器是以映象來建立的,映象是不是一個類似作業系統的環境?
是的,你可以將Docker理解為一個輕量化的虛擬機器,至於我們經常說的什麼Tomcat映象、MySQL映象之類的,只是這個輕量化的虛擬機器中安裝了相應的軟體。映象的名字也就說明了映象的功能。

是不是到正式環境上還要安裝Docker,然後把應用部署在其中?
是的,構建Docker映象、執行Docker容器,都需要安裝Docker,但這是一勞永逸的,因為我們使用的是安裝了各種各樣功能軟體的Docker映象和Docker容器。

如果是這樣,那和我建立一個和生產環境一樣的虛擬機器來部署應用有什麼區別?
首先這個問題可以用自行車和飛機的例子解答。其次安裝Docker後,我們可以從DockerHub上獲取各種各樣的作業系統映象,這個操作很簡單,只需要pull相應的映象到本地然後執行即可,而安裝不同版本的虛擬機器有多麻煩?另外DockerHub上有各種各樣的優秀映象,我們直接拿來使用就可以了,不需要自己搭建,應用的部署就像搭積木一樣簡單。




用docker最大的好處是你可以把你的應用以及應用執行依賴的環境和配置一起打包交付,做到開箱即用。利用容器部署應用,只需要下載一個你需要的映象,然後把映象run起來就可以了,跟你啟動一個二進位制程式是一樣的。容器啟動起來以後,應用就可以直接訪問了,不需要再去部署應用。如果是用虛擬機器的話,你還要先裝虛擬機器,然後裝執行環境,然後再安裝應用,配置,再啟動應用,比較麻煩,整個過程費時費力。當然在虛擬機器環境下,你也可以利用模板將所有這些過程自動化,也可以做到開箱即用。但問題是,虛擬機器建立和執行都很耗時耗資源,docker容器可以做到秒級別的啟動。雖然現在有些虛擬機器技術也可以到很快啟動,佔很少的資源,但總體來說還是沒有容器輕量級和方便。利用docker映象,可以很容易保證開發測試和生產環境的一致性。虛擬機器更適合做為IT基礎設施來使用,而容器更適合跑應用。



給個標準答案,不用謝:

1)標準化應用釋出,docker容器包含了執行環境和可執行程式,可以跨平臺和主機使用;

2)節約時間,快速部署和啟動,VM啟動一般是分鐘級,docker容器啟動是秒級;

3)方便構建基於SOA架構或微服務架構的系統,通過服務編排,更好的鬆耦合;

4)節約成本,以前一個虛擬機器至少需要幾個G的磁碟空間,docker容器可以減少到MB級;

5)方便持續整合,通過與程式碼進行關聯使持續整合非常方便;

6)可以作為集群系統的輕量主機或節點,在IaaS平臺上,已經出現了CaaS,通過容器替代原來的主機。

再透露一些資訊,以便對docker瞭解更多一些,國內做docker容器的公司現在不多,都有免費試用的服務,如果你感興趣可以一家一家去玩玩兒,精靈雲、道雲、時速雲、靈雀雲等,這四家我都已經玩兒了一遍。



樓上回答的很好了。

關於部署,我再補充一句:

  • 傳統的部署模式是:安裝(包管理工具或者原始碼包編譯)->配置->執行;
  • Docker的部署模式是:複製->執行。