容器技術概述

容器技術是這兩年熱門的話題,由於容器技術給咱們帶來了不少方便的地方,節約了很多成本,不論是在運維仍是開發上。而現在最熱門的開源容器工具就是docker了,雖然很多人已經使用過docker,可是若是不是老一輩的程序員的話,也許還不太能感覺到爲何容器技術會帶來許多的便捷?這一點是本文要探討的內容。php

先聊聊歷史,在好久好久之前,想要在線上服務器部署一個應用,首先須要購買一個物理服務器,在服務器安裝一個操做系統,而後安裝好應用所須要的各類依賴環境,最後才能夠進行應用的部署,並且一臺服務器只能部署一個應用。linux

示意圖:
容器技術概述程序員

這就形成了如下幾個明顯問題:docker

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

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

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

如此一來:windows

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

示意圖:
容器技術概述後端

虛擬化技術的優勢:centos

  • 資源池——一個物理機的資源分配到了不一樣的虛擬機裏
  • 很容易擴展——增長物理機或者虛擬機便可,由於虛擬機是能夠複製的
  • 很容易雲化——亞馬孫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)
相關文章
相關標籤/搜索