您好,登錄后才能下訂單哦!
一、docker簡介
Docker 官網:http://www.docker.com
Github Docker 源碼:https://github.com/docker/docker
https://github.com/moby/moby
1、docker是什么
Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從Apache2.0協議開源。
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
特性:一次封裝到處運行,很好的說明了Docker的跨平臺和強移植性。
Docker 是一個開源項目,誕生于 2013 年初,最初是 dotCloud 公司內部的一個業余項目。它基于 Google 公司推出的 Go 語言實現。 項目后來加入了 Linux 基金會,遵從了 Apache 2.0 協議,項目代碼在 GitHub 上進行維護。
Docker基礎是Linux 容器(LXC)基礎,并對其進行了更高層面的封裝,使得用戶不需要去關心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
Docker容器與傳統虛擬機不同,容器是在操作系統層面上實現虛擬化,直接復用本地主機的操作系統,而傳統方式則是在硬件層面實現。參考如下對比圖:
2.1 比虛擬機高效:
如前描述,因容器復用了本地主機操作系統,僅僅是封裝了容器運行所需的軟件環境(從這個角度看可以參考RPM安裝包),因此與主機上直接運行軟件所需的資源幾乎是一樣的。不像虛擬機那樣需要額外的內存、CPU等來支持虛擬機操作系統的運行。
2.2 快速交付和部署:
對開發和運維(devop)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。而且可以保證每一個地方運行的環境都是一模一樣的,不會因為開發環境與生產環境不同而導致某些問題。
docker容器的啟動更是秒級的,因此可以隨時快速生產、關閉。
2.3 輕松遷移和擴展:
docker鏡像可以在任意環境中遷移,而不會出現兼容性問題,遷移過程輕松方便。
2.4 管理簡單:
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化并且高效的管理。
2.5 docker對比傳統虛擬機
三、Docker架構
1、Docker的組織架構
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。
Docker 容器通過 Docker 鏡像來創建。
容器與鏡像的關系類似于面向對象編程中的對象與類。
Docker | 面向對象 |
---|---|
容器 | 對象 |
鏡像 | 類 |
docker架構如圖:
各組件介紹:
Docker 鏡像(Images) | Docker 鏡像是用于創建 Docker 容器的模板。 |
Docker 容器(Container) | 容器是獨立運行的一個或一組應用。 |
Docker 客戶端(Client) | Docker 客戶端通過命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 與 Docker 的守護進程通信。 |
Docker 主機(Host) | 一個物理或者虛擬的機器用于執行 Docker 守護進程和容器。 |
Docker 倉庫(Registry) | Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。 Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。 |
Docker Machine | Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
三、基本概念
Docker 包括三個基本概念
鏡像(Image)
容器(Container)
倉庫(Repository)
理解了這三個概念,就理解了 Docker 的整個生命周期。
3.1 鏡像:
Docker 鏡像就是一個只讀的模板。
例如:一個鏡像可以包含一個完整的 CentOS 操作系統環境,里面僅安裝了 httpd或用戶需要的其它應用程序。
鏡像可以用來創建 Docker 容器。
Docker 提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用。
我們都知道,操作系統分為內核和用戶空間。對于 Linux 而言,內核啟動后,會掛載 root
文件系統為其提供用戶空間支持。而 Docker 鏡像(Image),就相當于是一個 root
文件系統。比如官方鏡像 ubuntu:14.04
就包含了完整的一套 Ubuntu 14.04 最小系統的 root
文件系統。
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。
因為鏡像包含操作系統完整的 root
文件系統,其體積往往是龐大的,因此在 Docker 設計時,就充分利用 Union FS 的技術,將其設計為分層存儲的架構。所以嚴格來說,鏡像并非是像一個 ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現并非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。
鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
分層存儲的特征還使得鏡像的復用、定制變的更為容易。甚至可以用之前構建好的鏡像作為基礎層,然后進一步添加新的層,以定制自己所需的內容,構建新的鏡像。
關于鏡像構建,將會在后續相關章節中做進一步的講解。
3.2 容器:
Docker 利用容器來運行應用。
容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
可以把容器看做是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
*注:鏡像是只讀的,容器在啟動的時候創建一層可寫層作為最上層。
每一個鏡像都可能依賴于由一個或多個下層的組成的另一個鏡像。我們有時說,下層那個 鏡像是上層鏡像的父鏡像。
一個沒有任何父鏡像的鏡像,謂之基礎鏡像。
所有鏡像都是通過一個 64 位十六進制字符串 (內部是一個 256 bit 的值)來標識的。 為簡化使用,前 12 個字符可以組成一個短ID,可以在命令行中使用。短ID還是有一定的 碰撞機率,所以服務器總是返回長ID。
鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的類
和實例
一樣,
鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行于屬于自己的獨立的 命名空間。因此容器可以擁有自己的 root
文件系統、自己的網絡配置、自己的進程空間,甚至自己的用戶 ID
空間。容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立于宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也因為這種隔離的特性,很多人初學
Docker 時常常會把容器和虛擬機搞混。
前面講過鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個為容器運行時讀寫而準備的存儲層為容器存儲層。
容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失。
按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。
數據卷的生存周期獨立于容器,容器消亡,數據卷不會消亡。因此,使用數據卷后,容器可以隨意刪除、重新 run
,數據卻不會丟失。
3.3 倉庫:
倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫注冊服務器(Registry)混為一談,并不嚴格區分。實際上,倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。 其作為默認docker倉庫,但在國內下載速度很慢。當然,用戶也可以在本地網絡內創建一個私有倉庫。當用戶創建了自己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。
*注:Docker 倉庫的概念跟 Git 類似,注冊服務器可以理解為 GitHub 這樣的托管服務。
鏡像構建完成后,可以很容易的在當前宿主上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。
一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像。
通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用于對應該軟件的各個版本。我們可以通過 <倉庫名>:<標簽>
的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以 latest
作為默認標簽。
以 Ubuntu 鏡像 為例,ubuntu
是倉庫的名字,其內包含有不同的版本標簽,如,14.04
, 16.04
。我們可以通過 ubuntu:14.04
,或者 ubuntu:16.04
來具體指定所需哪個版本的鏡像。如果忽略了標簽,比如 ubuntu
,那將視為 ubuntu:latest
。
倉庫名經常以 兩段式路徑 形式出現,比如 jwilder/nginx-proxy
,前者往往意味著 Docker Registry 多用戶環境下的用戶名,后者則往往是對應的軟件名。但這并非絕對,取決于所使用的具體 Docker Registry 的軟件或服務。
Docker Registry 公開服務是開放給用戶使用、允許用戶管理鏡像的 Registry 服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,并可能提供收費服務供用戶管理私有鏡像。
最常使用的 Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry,并擁有大量的高質量的官方鏡像。除此以外,還有 CoreOS 的 Quay.io,CoreOS 相關的鏡像存儲在這里;Google 的 Google Container Registry,Kubernetes 的鏡像使用的就是這個服務。
由于某些原因,在國內訪問這些服務可能會比較慢。國內的一些云服務商提供了針對 Docker Hub 的鏡像服務(Registry Mirror),這些鏡像服務被稱為加速器。常見的有 阿里云加速器、DaoCloud 加速器、靈雀云加速器等。使用加速器會直接從國內的地址下載 Docker Hub 的鏡像,比直接從官方網站下載速度會提高很多。在后面的章節中會有進一步如何配置加速器的講解。
國內也有一些云服務商提供類似于 Docker Hub 的公開服務。比如 時速云鏡像倉庫、網易云鏡像服務、DaoCloud 鏡像市場、阿里云鏡像庫等。
除了使用公開服務外,用戶還可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做為私有 Registry 服務。在后續的相關章節中,會有進一步的搭建私有 Registry 服務的講解。
開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現,足以支持 docker
命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。在官方的商業化版本 Docker Trusted Registry 中,提供了這些高級功能。
除了官方的 Docker Registry 外,還有第三方軟件實現了 Docker Registry API,甚至提供了用戶界面以及一些高級功能。比如,VMWare Harbor 和 Sonatype Nexus。
四、Docker變身Moby之謎
本周,Docker突然變成了Moby,這次名稱的變更讓很多人感到一頭霧水。Docker(公司)決定將Docker(商業軟件產品)和Docker(開源項目)區分開來。在DockerCon大會上,該公司推出了Moby Project項目——它其實就是Docker開源項目的新名稱而已(相當于紅帽公司的Ferdora項目)。
在DockerCon大會上,該公司推出了Moby Project項目——它其實就是Docker開源項目的新名稱而已。Moby還扮演了另一個角色:為具體的基礎設施創建個性化容器軟件。
但這冰凍三尺,又非一日之寒。
早在 Docker 項目剛受到廣泛關注不久,就已經有很多意見指出 Docker 這個名字既是公司名字,又是開源項目的名字,而且很快又成了公司商業產品的名字,這本身就是很大的隱患。但 Docker 公司并沒有采取什么措施,反而更加關注和遏制任何第三方試圖濫用 Docker 關鍵字的苗頭。
Docker 公司有意無意之間制造的這個模糊地帶,在 Docker 項目高速發展的兩年里,將開源社區用心經營出來的龐大受眾和用戶群體,同公司未來商業產品的影響力和目標客戶通過 “Docker” 關鍵字成功的統一起來。然后,在 “Docker 到 Moby” 這個原本可以用來修正這個錯誤的時間點上,Docker 公司又毫無征兆地、以迅雷不及掩耳之勢完成了 Docker 項目的重命名。至此,“社區再無 Docker”,就成了這個無比成功的項目最后的感慨。這也是 Github 上和 HN 上的開發者感覺被冒犯的主要原因。
大多數容器用戶實際上并無需過分糾結 Docker 或者 Moby。免費的 Docker-CE 會一直存在,Moby 開源社區依然會活躍,而且模塊化后,要 hack 還變容易了,何樂而不為?
一句話版本,后面的可以不看:
Docker公司直接把原Docker項目改名成了Moby,是為了將之前數年里構建出來的龐大的粉絲團體和Google搜索內容(Google search footprint)全部轉移到Docker公司的商業產品上。
需要注意:
Docker公司的商業產品包括了Docker EE和Docker CE,前者是企業收費版,后者是社區免費版。
也就是說,以后大家用的(包括大家現在機器里已經安裝的)都是Docker公司的產品(注意,并不是項目),這個產品名叫Docker CE(命名方式如Docker 17.XX)。Docker公司也會不遺余力的鼓勵用戶在試用后購買付費版本(這很正常)。
二、關于Moby
Moby會以一個開源組織(Github Org)的方式存在。
Docker CE這個產品,會由Moby組織下的Moby項目以及其他項目構建和編譯出來的。
Moby組織下面的項目均由社區開發者共同維護。這也就意味著對于Moby社區的參與者來說,
你們今后的工作方式是:
貢獻Moby下的項目,然后使用Docker公司的Docker CE產品。
你也應該明白了,并不會存在一個開源項目叫Docker CE。
因為Docker CE是一個產品,你一定得從Docker公司官網上來下載使用。
三、用戶到底在抱怨什么?
拆分后的Moby項目們無論在Docker公司的投入上、新特性的開放程度上、還是開發者活躍程度上,都會受到不小的影響。
實際上,如果是正常的技術公司的話,一般會選擇繼續維護自己的開源項目,然后在自己公司里賣一個企業版以及企業服務。
這種例子太多了,幾乎每個開源項目都是這個套路。
但是唯獨Docker公司,它直接把Docker開源項目改名了,或者說的更直白一點,給抹去了。從這天開始,你再也不可能找到一個叫Docker的開源項目。你從Google上搜到所有跟『Docker』相關的信息,都會指向Docker公司的那兩個產品。原先Docker項目龐大的粉絲群,直接變成了Docker公司的客戶。
這也是為什么所羅門一再解釋『原先的Docker用戶并不受影響』但是很多人并不買賬的原因。問題不在于什么項目要改名啦,依賴庫不能用啦這種小問題。關鍵問題在于,原Docker開源項目的用戶被實實在在地愚弄了一把。這是前所未有的(不知道過去20年里大家有沒有類似的例子)。
四、為什么這樣做?
過去的20年里,成功的開源項目數不勝數,但是這些項目背后成功的商業公司堪稱寥寥。要較真說案例,也就RedHat這種能夠
控制到操作系統層面的公司,才勉強算是個成功的例子。其他的項目,越往上層走,越難盈利(因為用戶越難留住)。實際上,大多數開源項目的商業公司,能養活這個項目就已經很不錯了,盈利簡直是天方夜譚。這也是為什么這么多年了,業內還是沒事兒就討論一把『開源怎么掙錢』這個問題。一個字,難。
君不見,這個圈子里,無數來自伯克利、Google、手握著黑科技的開源公司都趴在地上起不來,Docker這個手里并不控制核心技術、靠著親人的UI/UX拿了天下的項目,盈利前景又如何呢?
Docker公司不可能看不到這個問題。別忘了它本身就是從一個PaaS公司(dotCloud)出來的,現在真沒什么心思考慮開源世界的理想抱負。他從Docker項目成功的第一天開始,就是奔著做下一個VMware去的。否則M$的40億美金收購,他根本沒理由拒絕掉。
我要賣產品,可是用戶在哪里?原Docker項目那4w多個star就跟我招手了。
真就這么急嗎?灣區這邊一直有傳言稱Docker公司的投資方定下了嚴苛的盈利標準,看來并不是天方夜譚。一個做純后端技術獨角獸,確實有為難的一面,誰讓咱的目標是NASDAQ上市呢。
五、關于Docker的未來
毫無疑問,Docker公司的未來是光明的,一個新的VMware正呼之欲出。但重要的是,這個新VMware構建在一種全新的、基于
開源的商業模式上,這其實正類似于新時代我們耳熟能詳的:粉絲經濟。
有人問:這么一來開發者也不是被得罪了不少嗎?
傻孩子。真正愿意付錢給Docker公司的老板們,才沒工夫上HackerNews和Github呢!
『Docker?嗯,我聽說過,好像還挺火的。小劉,咱們也上一套吧!』
立志做VMware的Docker公司,并沒有功夫關心國內賣『自研Docker企業版』的小伙伴們。什么『Docker原生』,你再原生還能原生的過Docker
EE?更何況,價格還不一定誰便宜呢。當然,國內有個信息閉塞的好處,大家還能拉著Docker公司的大旗,沾一下Docker龐大粉絲潮的光。
唯獨阿里云這個家伙、堂堂世界第三的云,竟然甘做Docker公司的代理人賣起了Docker EE。活該它在DockerCon上的新聞被國內的現場直播員們屏蔽(逃)。
只是,對于開源社區的參與者來說,就真剩下一片呵呵的表情了。Docker這么大的項目說沒就沒,無數人點上RIP真不為過。Moby社區的活躍度確實是個問號。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。