容器技術是這兩年熱門的話題,由於容器技術給咱們帶來了不少方便的地方,節約了很多成本,不論是在運維仍是開發上。而現在最熱門的開源容器工具就是docker了,雖然很多人已經使用過docker,可是若是不是老一輩的程序員的話,也許還不太能感覺到爲何容器技術會帶來許多的便捷?這一點是本文要探討的內容。php
先聊聊歷史,在好久好久之前,想要在線上服務器部署一個應用,首先須要購買一個物理服務器,在服務器安裝一個操做系統,而後安裝好應用所須要的各類依賴環境,最後才能夠進行應用的部署,並且一臺服務器只能部署一個應用。linux
示意圖:程序員
這就形成了如下幾個明顯問題:docker
虛擬化技術出現之後,對於這種問題有所改變,虛擬化技術會在本地操做系統之上加多一層 Hypervisor層,Hypervisor是一種運行在物理服務器和操做系統之間的中間軟件層,能夠虛擬化硬件資源,例如cpu、硬盤、內存資源等。而後咱們能夠基於經過虛擬化出來的資源之上安裝操做系統,這也就是所謂的虛擬機。數據庫
經過Hypervisor層,咱們能夠建立不一樣的虛擬機,而且能夠限定每一個虛擬機的物理資源,而且每一個虛擬機都是分離、獨立的。例如A虛擬機給它使用2個cpu、8g內存、100g磁盤,B虛擬機給它使用4個cpu、16g內存、300g磁盤。。。等等,這樣就能夠實現物理資源利用率的最大化。apache
如此一來:windows
示意圖:後端
虛擬化技術的優勢:centos
即然虛擬化技術已經很強大了,爲何還須要容器技術呢?這就涉及到虛擬化技術所帶來的侷限性了:服務器
以上所提到的這個問題還不是真正促使容器技術出現的根本緣由,真正使容器技術出現的是開發和運維所面臨的挑戰:
上圖中能夠看到開發與運維的環境都比較複雜,並且開發還分先後端以及測試等,運維環境則是基於服務器、交換機或者在雲上的(這不是廢話嗎),這就致使了開發環境和線上環境的差別。因此開發環境與運維環境之間沒法達到很好的橋接,在部署上線應用時,依舊須要花時間去處理環境不兼容的問題。
而容器技術正是解決了這種環境不一致的問題:
容器能夠幫咱們把開發環境及應用整個打包帶走,打包好的容器能夠在任何的環境下運行,這樣就能夠解決開發與運維環境不一致的問題了,因此:
以上只是描述是容器解決了什麼問題,可是尚未說明什麼是容器,不過其實簡單幾句話就能夠說明容器了:
容器和虛擬機的區別:
容器能夠和虛擬機結合在一塊兒使用,並且這也是目前主流的作法:
Docker是容器技術的一種實現,也是目前比較主流的開源的容器實現工具,docker出現的時間軸:
容器的思想:
Docker容器的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,能夠把貨物規整的擺放起來。而且各類各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麼我就不須要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱裏封裝的好好的,那我就能夠用一艘大船把他們都運走。docker就是相似的理念。如今都流行雲計算了,雲計算就比如大貨輪,docker就是集裝箱。
不一樣的應用程序可能會有不一樣的應用環境,好比.net開發的網站和php開發的網站依賴的軟件就不同,若是把他們依賴的軟件都安裝在一個服務器上就要調試好久,並且很麻煩,還會形成一些衝突。好比IIS和Apache訪問端口衝突。這個時候你就要隔離.net開發的網站和php開發的網站。常規來說,咱們能夠在服務器上建立不一樣的虛擬機在不一樣的虛擬機上放置不一樣的應用,可是虛擬機開銷比較高。docker能夠實現虛擬機隔離應用環境的功能,而且開銷比虛擬機小,小就意味着省錢了。
你開發軟件的時候用的是Ubuntu,可是運維管理的都是centos,運維在把你的軟件從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,好比:有個特殊版本的數據庫,只有Ubuntu支持,centos不支持,在轉移的過程中運維就得想辦法解決這樣的問題。這時候要是有docker你就能夠把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就能夠了。並且部署速度快。
docker特色:
docker的 官網地址:
docker從1.13x開始,版本分爲社區版ce和企業版ee,而且基於年月的時間線形式,當前最新穩定版爲17.09 參考:
http://blog.csdn.net/chenhaifeng2016/article/details/68062414
官方給的Docker和傳統虛擬化的比較描述:
Docker的優點:
Docker核心概念: