標籤:

如何通俗解釋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是容器,放啥呢?

放應用。

應用是啥?

一個網站就是應用啊~

一個程序也是應用啊~

甚至,一個系統也是應用啊~

從此以後我就不用配環境了,

也不用裝環境了,

更不用統一環境了,

因為docker都打包好了啊~

開一個容器還不到一秒,

環境什麼的,別人也都配好了,

我就老老實實寫代碼就OK了啊,

崩潰了重啟嘛,

重啟才三秒。

所以,docker就是用來存放應用的一個容器。

就像

杯子可以存水,

筆筒可以放筆,

酒瓶可以盛酒,

書包可以裝書,

相機可以存照片,

電腦可以放小電影

一樣。

docker就跑應用的一種容器。

更輕量,更簡單,更快速,更,好玩。


本答案來自騰訊高級工程師鄒立巍的 《什麼是 Docker ?》;

文章篇幅略長,在此針對問題摘取部分內容進行回答,有興趣的歡迎閱讀原文了解更多。

好啦,開始進入正題:

如何通俗解釋Docker是什麼?有個著名的隱喻:集裝箱。但是它卻起了個「碼頭工人」(docker 的英文翻譯)的名字。

這無疑給使用者很多暗示:「快來用吧!用了Docker,就像世界出現了集裝箱,這樣你的業務就可以隨意的、無拘無束的運行在任何地方(Docker 公司的口號:Build,Ship,and Run Any App,Anywhere),於是碼頭工人就基本都可以下崗了。」但是人們往往忽略了一個問題,隱喻的好處是方便人理解一個不容易理解的概念,但並不能解釋其概念本身。

互聯網技術行業的一大特點是,這裡的絕大多數事物並不像現實生活那麼具體,在這個行業中我們所接觸的絕大多數概念都是抽象的、不具體的。所以現實生活中很多可笑的事情在互聯網技術行業就不僅變的不可笑,反而可能很嚴肅。就比如,現實生活中你是幾乎不可能看見兩個神經正常的成年人爭論到底是鎚子更好還是螺絲刀更好這個問題的。而在我們這個行業,你可以很容易的被捲入到底是 java 好?還是 php 好?還是 js 好?或者類似的語言之爭中。當然除了語言,其它的軟體工具之爭也比比皆是,比如經典的還有 vim vs emacs。

由於不具體和抽象,就需要隱喻來給投資人解釋其價值,畢竟投資人大多數是外行嘛。至於 docker 到底是「集裝箱」還是「碼頭工人」並不重要,即使這兩個概念本質上衝突了都不重要,很少有人會去真的思考集裝箱的出現導致碼頭工人幾乎絕跡。只要能讓大家明白 docker 是個重要的、有價值的、劃時代的工具,騙到投資人的錢就足夠了。也很少有投資人去考究集裝箱的發明人到底有沒有因此賺到錢?以及為什麼沒賺到錢?只要概念能忽悠人就行了。當然這個概念順便也忽悠了所有懶得思考的技術工程師。

吐了一大段槽之後,回到我們的正題,docker 到底是什麼?既然大家喜歡集裝箱這個隱喻,那麼我們也不妨先來看看集裝箱的本質。大家應該基本都理解集裝箱是怎麼改變世界的吧?在集裝箱之前,貨物運輸沒有統一的標準方式進行搬運,於是鐵路、公路、海洋等各種運輸之間,需要大量的人力作為貨物中轉,效率極低,而且成本很高。集裝箱出現之後,世界上絕大多數的貨物運輸都可以放到這個神奇的箱子里,然後在公路、鐵路、海洋等所有運輸場景下,這個箱子都可以不用變化形態直接可以承運,而且中間的中轉工作,都可以通過大型機械搞定,效率大大提升。從此全球化開始,商業的潛力被進一步挖掘......牛逼之處我就不多說了,可是這個箱子為什麼這麼神奇呢?答案其實也就在上面的描述中,無非就是兩個字:標準。

以上是騰訊高級工程師鄒立巍在《什麼是 Docker?》這篇文章的上半部分對Docker的通俗解釋;文章的下半部分還講解了Docker 的實質是什麼?在作者看來就是個針對PAAS平台的自動化運維工具而已。眾所周知:自動化運維的大前提就是標準化。對此標準進行了詳解。

另外,小編還整理了一系列Docker相關的精品文章【乾貨合集】Docker快速入門與進階。


Docker從入門到進階系列學習內容

隨著docker現在越來越熱門,自己也對docker的好奇心也越來越重,終於忍不住利用了一些時間把docker學習一遍。目前的資料不少,但是由於docker的發展較快,每個團隊對docker的關注點也並不相同,大部分的文章還是不夠完整和易懂,小編整理幾篇文章, 大白話Docker入門(一)-博客-雲棲社區-阿里雲


近似=杯具

餛飩的砂鍋和生煎的油鍋都是一種容器,它將原先不固定差異化的內容,按照既定的標準來發布。這對整個產品的交付周期來說是一次劃時代的革命。砂鍋餛飩的故事更是將容器的使用推上了更高階段,同一個容器,貫穿開發測試生產和交付四個環節,帶來的不僅僅是便利,也提升了產品質量,加速了迭代速度,減少了產品風險,還降低成本。

http://open.daocloud.io/sha-guo-hun-tun-de-jiao-fu-jian/


用Docker的logo來解釋,鯨魚和集裝箱

那個大鯨魚(或者是貨輪)就是操作系統

把要交付的應用程序看成是各種貨物,原本要將各種各樣形狀、尺寸不同的貨物放到大鯨魚上,你得為每件貨物考慮怎麼安放(就是應用程序配套的環境),還得考慮貨物和貨物是否能疊起來(應用程序依賴的環境是否會衝突)。

現在使用了集裝箱(容器)把每件貨物都放到集裝箱里,這樣大鯨魚可以用同樣地方式安放、堆疊集裝了,省事省力。

Docker就是這整套機制啦


租過房子沒?

單個服務直接部署在物理機上不做虛擬化,就好比你一家人整個大房子住,好不好?當然好,但是貴啊,有錢就這麼玩,省心,比如——銀行。

那我錢沒那麼多怎麼辦,混部唄,就好比你和你舅兩家合住一個大房子,也能住的挺舒服,不過所有的資源就不像你單獨住的時候那麼隨心所欲,你倆得商量著來,比如:你外甥非要佔用向陽的書房(埠/目錄佔用),你可能也只能讓出來。

啊~,這樣兩家人住一起好不舒服,怎辦?有錢買房,沒錢就隔斷唄!隔斷這招就是虛擬機(VM)的思路了,虛擬機的這種隔斷你可以理解成比較決絕的隔斷,牆上自己掏洞開個門開個窗,廚房衛生間我在自己的這個隔斷里都單獨來一套,基本就是一個完整的家裝工程了,你進這個隔斷感覺——喔,這就是個完整的房子嘛。 所以虛擬機的好處壞處也你也就明白了:隔離效果好,但是損耗大。

那有沒有更節約的做法呢,有啊,當過北漂上漂肯定租過單間,做的好一點是中介,比如自如(請打給我廣告費,謝謝!),就是docker,不僅能做資源隔離,人家還規範化系統化了(repo/image),所有房間(container)統一裝修和傢具,你交錢簽約就能享受一個相對獨立的生活環境(environment)了,你自己的東西在你屋子裡隨便擺,都可以的;對中介來說,你當下不過就是個正在running的instance,的當你gameover了以後,這個房間他還可以以很小的代價租給別人run,是不是效率好高了? 當然自如到現在還沒有給每家單獨安裝水電燃氣表,這點上還是要給差評的,沒doker做的好。

以上。


我覺得將docker的類比成集裝箱只適合給不懂程序的人解釋,而給程序員解釋則應該這樣類比:鏡像就像程序的原代碼編譯後的二進位,是一個打包的過程,如果要修改程序,那就得修改源代碼重新編譯,那修改鏡像肯定也要重新生成鏡像了;容器就像二進位程序運行時的進程,如果要修改進程,那還不得把進程殺掉,修改源代碼,再次編譯,再次運行。所以容器就是大一號的進程。


通俗?

那我才敢說一說:

虛擬機 隔離得好,但是代價大:同樣的物理機,同時運行10個虛擬機,可能就力不從心了

docker相當於輕量級的虛擬機,放棄某些隔離效果換來低代價:同樣的物理機,同時運行成千上萬個docker都可能,而且啟動非常快(虛擬機都有一個「硬體」自檢、OS啟動的過程;docker基本無這個過程,因為是直接運行在物理機的OS上的)

但虛擬機可以在OSa上同時運行出n個OSa和m個OSb、p個OSc。。。

而docker只能在OSa上同時運行x個OSa(雖然x&>&>n+m+p+...)


一種用戶態虛擬機,利用 Linux 的控制組、特殊文件系統等基礎,以受控方式建立宿主系統的進程運行虛擬系統的進程,所謂受控就是攔截虛擬系統內的資源訪問請求並加以解釋。

因此具有虛擬機相似的能力,但運行時資源訪問損耗比較小,因而可以在一個宿主機上運行大量的容器實例,可以方便的容器鏡像文件進行傳遞和重建。


人們開發了操作系統的進程,後來覺得進程太浪費,又搞了線程,後來又覺得線程還是浪費,就搞了纖程。而容器則是自動化部署的反方向,發布單獨程序文件不解氣,打包發布,打包發布還不解氣,web伺服器組件發布,web伺服器組件發布還不解氣,然後操作系統配置一起發布。不知道解釋的對不對?


Docker 是一種應用容器化交付的技術。容器化就是超強的靜態編譯——從操作系統到依賴庫亂七八糟東西全給你「靜態編譯」到一起變成一個 super fat binary,就是一個容器。


好像有人修改問題了,在計算機軟體開發這個領域,想知道一個東西是什麼,一般通過類比是沒有用的,因為所有的類比都會丟失實際場合,而這往往阻止提問者理解為什麼需要這個技術。我認為,只有知道為什麼會出現這樣的技術,才能理解這個技術解決了什麼問題,並最終回答「這是什麼東西」

我為此寫了一個系列文章,傳送門: Docker為什麼

~~~~~~~~~~~~~~~原答案分割線~~~~~~~~~~~~~~~

docker的標準類比就是集裝箱啊同學,這有啥好問的呢?

如果覺得這個類比太土,建議聽一下《羅輯思維》的一期 「改變世界的箱子」 ,對應的書名為《集裝箱改變世界》


Java號稱「一次編譯,到處運行」,因為java虛擬機解決平台的兼容性問題,所以有java虛擬機的地方就能跑java代碼;

Docker是:「一次封裝,到處運行」,因為docker決絕了應用環境的問題,安裝了docker的平台就能跑「docker包」,這樣就決絕了「開發環境能跑,一上線就崩」的尷尬。


輕量化虛擬技術,甚至理解成輕量化虛擬機。 新手從這個角度開挖吧,比較直觀。


蘋果上的app,linux上的docker


"docker is like iframes for linux"

-------https://twitter.com/joevennix


一個可以分配資源的進程隔離模型。


Docker是一個能夠把開發的應用程序自動部署到容器的開源引擎。

推薦閱讀:《第一本Docker書》([澳]James Turnbull)【摘要 書評 試讀】


今天剛看完docker,開始安裝的時候,我用的是win10系統,網上說docker專門對win10做了適配,然後我就下載了一個,這時候說需要使用win10的hyper-v,我就很納悶的這到底是個啥東西,需要使用虛擬化技術,等教程全部看完之後我明白了,docker就是為了方便移植,直接將我這個應用本體加上所需要的環境打包起來,等要換個伺服器的時候,使用虛擬化技術虛擬出原來的運行環境就可以直接使用了。感覺就像是我用一個環境就去開一個適配這個環境的虛擬機。不必去做其他的配置了。速度真的快。

新手回答問題,有回答的錯誤的地方歡迎指正,輕噴。


推薦閱讀:

網易蜂巢的原理是什麼?通俗的舉例說明
VAGRANT 和 Docker的使用場景和區別?
Docker 有什麼優勢?
在雲環境中的應用部署方式上,Docker會不會取代KVM、Xen之類的虛擬機技術?
docker在web開發中得使用流程是怎樣的?

TAG:Docker |