1. 程式人生 > >容器技術概述

容器技術概述

容器技術 虛擬化 Docker

容器技術是這兩年熱門的話題,因為容器技術給我們帶來了很多方便的地方,節約了不少成本,不管是在運維還是開發上。而如今最熱門的開源容器工具就是docker了,雖然不少人已經使用過docker,但是如果不是老一輩的程序員的話,也許還不太能感受到為什麽容器技術會帶來許多的便捷?這是本文要探討的內容。

先聊聊歷史,在很久很久以前,想要在線上服務器部署一個應用,首先需要購買一個物理服務器,在服務器安裝一個操作系統,然後安裝好應用所需要的各種依賴環境,最後才可以進行應用的部署,而且一臺服務器只能部署一個應用。

示意圖:
技術分享圖片

這就造成了以下幾個明顯問題:

  • 部署應用非常慢
  • 需要花費的成本非常高
  • 而且容易造成資源的浪費,因為往往一個應用使用不了一個服務器的資源
  • 難於遷移和擴展
    • 遷移問題:要把應用進行遷移,又得重復部署應用的過程:買服務器 -> 安裝os -> 配置環境 -> 部署應用
    • 擴展問題:只能購買新的硬件來升級物理服務器,或者購買更高性能的服務器,這就又涉及到遷移問題了
  • 可能會被限定硬件廠商,因為那時候有不同硬件平臺

虛擬化技術出現以後,對於這種問題有所改變,虛擬化技術會在本地操作系統之上加多一層 Hypervisor層,Hypervisor是一種運行在物理服務器和操作系統之間的中間軟件層,可以虛擬化硬件資源,例如cpu、硬盤、內存資源等。然後我們可以基於通過虛擬化出來的資源之上安裝操作系統,這也就是所謂的虛擬機。

通過Hypervisor層,我們可以創建不同的虛擬機,並且可以限定每個虛擬機的物理資源,並且每個虛擬機都是分離、獨立的。例如A虛擬機給它使用2個cpu、8g內存、100g磁盤,B虛擬機給它使用4個cpu、16g內存、300g磁盤。。。等等,這樣就可以實現物理資源利用率的最大化。

如此一來:

  • 一臺物理機就可以部署多個應用
  • 每個應用都可以獨立運行在一個虛擬機裏

示意圖:
技術分享圖片

虛擬化技術的優點:

  • 資源池——一個物理機的資源分配到了不同的虛擬機裏
  • 很容易擴展——增加物理機或者虛擬機即可,因為虛擬機是可以復制的
  • 很容易雲化——亞馬孫AWS,阿裏雲,谷歌雲等

即然虛擬化技術已經很強大了,為什麽還需要容器技術呢?這就涉及到虛擬化技術所帶來的局限性了:

  • 每一個虛擬機都是一個完整的操作系統,所以需要給其分配物理資源,當虛擬機數量增多時,操作系統本身消耗的資源勢必增多

以上所提到的這個問題還不是真正促使容器技術出現的根本原因,真正使容器技術出現的是開發和運維所面臨的挑戰:
技術分享圖片

上圖中可以看到開發與運維的環境都比較復雜,而且開發還分前後端以及測試等,運維環境則是基於服務器、交換機或者在雲上的(這不是廢話嗎),這就導致了開發環境和線上環境的差異。所以開發環境與運維環境之間無法達到很好的橋接,在部署上線應用時,依舊需要花時間去處理環境不兼容的問題。

而容器技術正是解決了這種環境不一致的問題:
技術分享圖片

容器可以幫我們把開發環境及應用整個打包帶走,打包好的容器可以在任何的環境下運行,這樣就可以解決開發與運維環境不一致的問題了,所以:

  • 容器解決了開發和運維之間的矛盾
  • 在開發和運維之間搭建了一個橋梁,是實現devops的最佳解決方案

以上只是描述是容器解決了什麽問題,但是還沒有說明什麽是容器,不過其實簡單幾句話就可以說明容器了:

  • 對軟件和其依賴環境的標準化打包
  • 應用之間相互隔離
  • 共享一個OS Kernel
  • 可以運行在很多主流操作系統上

技術分享圖片

容器和虛擬機的區別:
技術分享圖片

容器可以和虛擬機結合在一起使用,而且這也是目前主流的做法:
技術分享圖片

Docker是容器技術的一種實現,也是目前比較主流的開源的容器實現工具,docker出現的時間軸:
技術分享圖片


容器的思想:

Docker容器的思想來自於集裝箱,集裝箱解決了什麽問題?在一艘大船上,可以把貨物規整的擺放起來。並且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麽我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱裏封裝的好好的,那我就可以用一艘大船把他們都運走。docker就是類似的理念。現在都流行雲計算了,雲計算就好比大貨輪,docker就是集裝箱。

  1. 不同的應用程序可能會有不同的應用環境,比如.net開發的網站和php開發的網站依賴的軟件就不一樣,如果把他們依賴的軟件都安裝在一個服務器上就要調試很久,而且很麻煩,還會造成一些沖突。比如IIS和Apache訪問端口沖突。這個時候你就要隔離.net開發的網站和php開發的網站。常規來講,我們可以在服務器上創建不同的虛擬機在不同的虛擬機上放置不同的應用,但是虛擬機開銷比較高。docker可以實現虛擬機隔離應用環境的功能,並且開銷比虛擬機小,小就意味著省錢了。

  2. 你開發軟件的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟件從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,比如:有個特殊版本的數據庫,只有Ubuntu支持,centos不支持,在轉移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。

  3. 在服務器負載方面,如果你單獨開一個虛擬機,那麽虛擬機會占用空閑內存的,docker部署的話,這些內存就會利用起來。總之docker就是集裝箱原理。

docker特點:

  • Docker由go語言編寫的,基於apache2.0協議發布。
  • 基於linux kernel,要想在windows下運行需要借助一個vm(虛擬機)來實現

docker的 官網地址:

https://www.docker.com/

docker從1.13x開始,版本分為社區版ce和企業版ee,並且基於年月的時間線形式,當前最新穩定版為17.09 參考:

http://blog.csdn.net/chenhaifeng2016/article/details/68062414

官方給的Docker和傳統虛擬化的比較描述:
技術分享圖片
技術分享圖片

Docker的優勢:

  • 啟動非常快,秒級實現
  • 資源利用率高,一臺高配置服務器可以跑上千個docker容器
  • 更快的交付和部署,一次創建和配置後,可以在任意地方運行
  • 內核級別的虛擬化,不需要額外的hypevisor支持,會有更高的性能和效率
  • 易遷移,平臺依賴性不強

技術分享圖片

Docker核心概念:

  • 鏡像,是一個只讀的模板,類似於安裝系統用到的那個iso文件,我們通過鏡像來完成各種應用的部署。
  • 容器,鏡像類似於操作系統,而容器類似於虛擬機本身。它可以被啟動、開始、停止、刪除等操作,每個容器都是相互隔離的。
  • 倉庫,存放鏡像的一個場所,倉庫分為公開倉庫和私有倉庫。 最大的公開倉庫是Docker hub(hub.docker.com),國內公開倉庫(dockerpool.com)

容器技術概述