1. 程式人生 > >容器到底是個啥?(附Docker學習資源彙總)

容器到底是個啥?(附Docker學習資源彙總)

關注嘉為科技,獲取運維新知

目錄

Docker與容器

  • 初識容器與Docker

  • 為什麼要使用Docker

  • Docker優勢簡介

Docker核心概念

  • Docker客戶端和伺服器

  • Docker映象

  • Docker倉庫

  • Docker容器

  • Docker的核心實現技術

  • 資料卷

  • 容器網路技術

  • Dcokfile

  • Docker命令彙總

Docker與虛擬化

  • Docker為什麼能夠成功?

  • 研發、測試和運維該如何看待Docker?

  • Docker與虛擬化各自邊界在哪裡?

  • Docker能取代虛擬化嗎?

 Docker學習資源彙總

Docker與容器

初識容器與Docker

容器技術起源於Linux開源平臺,並且經歷了比較長時間的發展階段,其中最重要的成果是Linux容器(Linux Containers,LXC)技術。

IBM DeveloperWorks網站關於容器技術的描述是這樣的:“容器有效地將由單個作業系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求。與虛擬化相比,這樣既不需要指令級模擬,也不需要即時編譯。容器可以在核心CPU本地執行指令,而不需要任何專門的解釋機制。此外,也避免了準虛擬化(paravirtualization)和系統呼叫替換中的複雜性。”

聽不明白,是吧?

直白的翻譯過來就是這樣的:如果認為虛擬機器是模擬執行的一整套作業系統(包括核心、應用執行態環境和其他系統環境)和跑在上面的應用,那麼容器就是獨立執行的一個(或一組)應用,以及它們必需的執行環境。

容器中執行的就是一個或者多個應用程式,以及應用執行所需要的環境。容器直接執行在作業系統核心之上的使用者空間。容器技術可以讓多個獨立的使用者空間執行在同一臺宿主機上。容器既可以執行在物理機也可以執行在虛擬機器上,當然也可以執行在公有云主機上。

在LXC之前,這些相關技術經過多年的演化已經十分成熟和穩定,但是由於種種原因,它們並沒有被很好地整合到主流的Linux核心中,使用者使用起來並不方便。例如,如果使用者要使用OpenVZ技術,需要先手動給作業系統打上特定的核心補丁方可使用,而且不同版本並不一致。類似的困難造成在很長一段時間內,這些優秀的技術只流傳於技術人員的小圈子中。

後來LXC專案借鑑了前人成熟的容器設計理念,並基於一系列新引入的核心特性,實現了更具擴充套件性的虛擬化容器方案。更加關鍵的是,LXC終於被整合到了主流Linux核心中,進而成為了Linux系統輕量級容器技術的事實標準。從技術層面來看,LXC已經趟過了絕大部分的“坑”,完成了容器技術實用化的大半歷程。

那麼Docker又是什麼呢?

Docker是輕量級容器管理引擎,它的出現為軟體開發和雲端計算平臺之間建立了橋樑。我們如果把容器對標為虛擬機器的話,Docker可以對標為hypervisor管理層,它是一個容器管理引擎技術,而不是容器本身。這一點是經常被混淆的。它的作用是提供了一套優雅、簡潔的工具,利用linux開源生態已有技術,實現容器橫向和縱向生命週期的完整、簡單、高效、快捷的管理。

在前述LXC的基礎上,Docker進一步優化了容器的使用體驗,讓它進入了尋常百姓家。

首先,Docker提供了各種容器管理工具(如分發、版本、移植等)讓使用者無需關注底層的操作,可以更簡單明瞭地管理和使用容器;其次,Docker通過引入分層檔案系統構建和高效的映象機制,降低了遷移難度,極大地提升了使用者體驗。使用者操作Docker容器就像操作應用自身一樣簡單。

Docker是基於Go語言實現的開源容器專案,誕生於2013年年初,最初發起者是dotCloud公司。Docker自開源後受到廣泛的關注和討論,目前已有多個相關專案(包括Docker三劍客、Kubernetes 等),逐漸形成了圍繞Docker容器的生態體系。 由於Docker在業界造成的影響力實在太大,dotCloud公司後來也直接改名為Docker Inc,並專注於Docker相關技術和產品的開發。

Docker的構想是要實現“Build,Ship and Run Any App, Anywhere”,即通過對應用的封裝(Packaging)、分發 (Distribution)、部署(Deployment)、執行(Runtime)生命週期進行管理,達到應用元件“一次封裝,到處執行”的目的。這裡的應用元件,既可以是一個Web應用、一個編譯環境,也可以是一套資料庫平臺服務,甚至是一個作業系統或叢集。

基於Linux平臺上的多項開源技術,Docker提供了高效、敏捷和輕量級的容器方案,並支援部署到本地環境和多種主流雲平臺。可以說,Docker首次為應用的開發、執行和部署提供了“一站式”的實用解決方案。

為什麼要使用Docker

(1)提供一種簡單、輕量的應用建模方式

在雲時代,開發者建立的應用必須要能很方便地在網路上傳播,也就是說應用必須脫離底層物理硬體的限制;同時必須是“任何時間、任何地點”可獲取的。因此,開發者需要一種新型的建立分散式應用程式的方式,快速分發和部署,這正是Docker所能夠提供的最大優勢。

Docker通過容器來打包應用,解耦應用和執行平臺。意味著遷移的時候,只需要在新的伺服器上啟動需要的容器就可以了,無論新舊伺服器是否是同一型別的平臺。這無疑將節約大量的寶貴時間,並降低部署過程出現問題的風險。

(2)職責的邏輯分離

使用 Docker,開發人員只需要關心容器中執行的應用程式,而運維人員只需要關心如何管理容器。Docker設計的目的就是要加強開發人員寫程式碼的開發環境與應用程式要部署的生產環境的一致性,從而降低那種“開發時一切都正常,肯定是運維的問題”的風險。

(3)快速、高效的開發生命週期

Docker的目標之一就是縮短程式碼從開發、測試到部署、上線執行的週期,讓你的應用程式具備可移植性,易於構建,並易於協作。

(4)鼓勵使用面向服務的架構

Docker還鼓勵面向服務的架構和微服務架構。Docker推薦單個容器只執行一個應用程式或程序,這樣就形成了一個分散式的應用程式模型,在這種模型下,應用程式或服務都可以表示為一系列內部互聯的容器,從而使分散式部署應用程式,擴充套件或除錯應用程式都變得非常簡單,同時也提高了程式的內省性。

Docker核心概念集合

Docker客戶端和伺服器

Docker 架構如下圖所示:

Docker 採用的是 Client/Server 架構。客戶端向伺服器傳送請求,伺服器負責構建、執行和分發容器。客戶端和伺服器可以執行在同一個 Host 上,客戶端也可以通過 socket 或 REST API 與遠端的伺服器通訊。

最常用的 Docker 客戶端是 docker 命令。通過 docker 我們可以方便地在 Host 上構建和執行容器。docker 支援很多操作(子命令)。除了 docker 命令列工具,使用者也可以通過 REST API 與伺服器通訊。

關於Docker API我們後續會詳細介紹。

Docker 伺服器:Docker daemon 是伺服器元件,以 Linux 後臺服務的方式執行。

Docker daemon 執行在 Docker host 上,負責建立、執行、監控容器,構建、儲存映象。

預設配置下,Docker daemon 只能響應來自本地 Host 的客戶端請求。如果要允許遠端客戶端請求,需要在配置檔案中開啟 TCP 監聽。

Docker映象

Docker的大部分操作都圍繞著它的三大核心概念——映象、容器和倉庫而展開。因此,準確把握這三大核心概念對於掌握Docker技術尤為重要。

Docker映象類似於虛擬機器映象,可以將它理解為一個只讀的模板。例如,一個映象可以包含一個基本的作業系統環境,裡面僅安裝了Apache應用程式(或使用者需要的其他軟體)。可以把它稱為一個Apache映象。

映象是建立Docker容器的基礎。通過版本管理和增量的檔案系統,Docker提供了一套十分簡單的機制來建立和更新現有的映象,使用者甚至可以從網上下載一個已經做好的應用映象,並直接使用。

Docker映象與傳統xen虛擬化中提到的映象或者虛擬機器模板底層實現原理是截然不同的。聯合檔案系統是實現Docker映象的技術基礎。

Docker映象是由檔案系統疊加而成。最底端是一個引導檔案系統,即bootfs,這很像典型的Linux/Unix的引導檔案系統。Docker使用者幾乎永遠不會和引導檔案系統有什麼互動。實際上,當一個容器啟動後,它將會被移到記憶體中,而引導檔案系統則會被解除安裝(unmount),以留出更多的記憶體供 initrd磁碟映象使用。

Docker映象的第二層是root檔案系統rootfs ,它位於引導檔案系統之上。rootfs可以是一種或多種作業系統(如 Debian或者Ubuntu檔案系統)。

在傳統的Linux引導過程中,root檔案系統會最先以只讀的方式載入,當引導結束並完成了完整性檢查之後,它才會被切換為讀寫模式。但是在Docker裡,root檔案系統永遠只能是隻讀狀態,並且Docker利用聯合載入(union mount)技術又會在root檔案系統層上載入更多的只讀檔案系統。

聯合載入指的是一次同時載入多個檔案系統,但是在外面看起來只能看到一個檔案系統。聯合載入會將各層檔案系統疊加到一起,這樣最終的檔案系統會包含所有底層的檔案和目錄。

Docker將這樣的檔案系統稱為映象。一個映象可以放到另一個映象的頂部。位於下面的映象稱為父映象(parent image),可以依次類推,直到映象棧的最底部,最底部的映象稱為基礎映象(base image)。

最後,當從一個映象啟動容器時,Docker會在該映象的最頂層載入一個讀寫檔案系統。我們想在Docker中執行的程式就是在這個讀寫層中執行的。

當 Docker第一次啟動一個容器時,初始的讀寫層是空的。當檔案系統發生變化時,這些變化都會應用到這一層上。比如,如果想修改一個檔案,這個檔案首先會從該讀寫層下面的只讀層複製到該讀寫層。該檔案的只讀版本依然存在,但是已經被讀寫層中的該檔案副本所隱藏。

通常這種機制被稱為寫時複製(copy on write),這也是使Docker如此強大的技術之一。 每個只讀映象層都是隻讀的,並且以後永遠不會變化。當建立一個新容器時,Docker會構建出一個映象棧,並在棧的最頂端新增一個讀寫層。這個讀寫層再加上其下面的映象層以及一些配置資料,就構成了一個容器。

Docker容器

Docker容器類似於一個輕量級的沙箱,Docker利用容器來執行和隔離應用。容器是從映象建立的應用執行例項。可以將其啟動、開始、停止、刪除,而這些容器都是彼此相互隔離的、互不可見的。

可以把容器看做是一個簡易版的Linux系統環境(包括root使用者許可權、程序空間、使用者空間和網路空間等)以及執行在其中的應用程式打包而成的盒子。

映象自身是隻讀的。容器從映象啟動的時候,會在映象的最上層建立一個可寫層。

Docker可以幫使用者構建和部署容器,使用者只需要把自己的應用程式或服務打包放進容器即可。容器是基於映象啟動起來的,容器中可以執行一個或多個程序。我們可以認為,映象是Docker生命週期中的構建或打包階段,而容器則是啟動或執行階段。

總結起來,Docker容器就是:

  • 一個映象格式;

  • 一系列標準的操作;

  • 一個執行環境。

Docker借鑑了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker將這個模型運用到自己的設計哲學中,唯一不同的是:集裝箱運輸貨物,而 Docker運輸軟體。 每個容器都包含一個軟體映象,也就是容器的“貨物”,而且與真正的貨物一樣,容器裡的軟體映象可以進行一些操作。例如,映象可以被建立、啟動、關閉、重啟以及銷燬。

和集裝箱一樣,Docker在執行上述操作時,並不關心容器中到底塞進了什麼,它不管裡面是Web伺服器,還是資料庫,或者是應用程式伺服器什麼的。所有容器都按照相同的方式將內容“裝載”進去。

Docker也不關心使用者要把容器運到何方:使用者可以在自己的筆記本中構建容器,上傳到 Registry,然後下載到一個物理的或者虛擬的伺服器來測試,再把容器部署到Amazon EC2 主機的叢集中去。像標準集裝箱一樣,Docker容器方便替換,可以疊加,易於分發,並且儘量通用。

使用 Docker,可以快速構建一個應用程式伺服器、一個訊息匯流排、一套實用工具、一個持續整合(continuous integration, CI)測試環境或者任意一種應用程式、服務或工具。可以在本地構建一個完整的測試環境,也可以為生產或開發快速複製一套複雜的應用程式棧。

可以說,Docker的應用場景相當廣泛。

Registry與Docker倉庫

Docker倉庫類似於程式碼倉庫,它是Docker集中存放映象檔案的場所。

有時候會看到有資料將Docker倉庫和倉庫註冊伺服器 (Registry)混為一談,並不嚴格區分。實際上,倉庫註冊伺服器是存放倉庫的地方,其上往往存放著多個倉庫。每個倉庫集中存放某一類映象,往往包括多個映象檔案,通過不同的標籤(tag)來進行區分。例如存放Ubuntu作業系統映象的倉庫稱為Ubuntu倉庫,其中可能包括14.04、12.04等不同版本的映象。

Registry與Docker之間關係如下圖所示:

根據所儲存的映象公開分享與否,Docker倉庫可以分為公開倉庫 (Public)和私有倉庫(Private)兩種形式。目前,最大的公開倉庫是官方提供的Docker Hub,其中存放了數量龐大的映象供使用者下載。 國內不少雲服務提供商(如時速雲、阿里雲等)也提供了倉庫的本地源,可以提供穩定的國內訪問。

當然,使用者如果不希望公開分享自己的映象檔案,Docker也支援使用者在本地網路內建立一個只能自己訪問的私有倉庫。當用戶建立了自己的映象之後就可以使用push命令將它上傳到指定的公有或者私有倉庫。這樣使用者下次在另外一臺機器上使用該映象時,只需要將其從倉庫上pull下來就可以了。

可以看出,Docker利用倉庫管理映象的設計理念與Git非常相似,實際上在理念設計上借鑑了Git的很多優秀思想。

Docker的技術元件

Docker可以運行於任何安裝了現代Linux核心的x64主機上。推薦的核心版本是3.8或者更高。Docker的開銷比較低,可以用於伺服器、桌上型電腦或筆記本。

Docker的技術元件主要包括以下幾個部分。事實上,每個技術元件展開都是非常長的篇幅,這裡我們就不展開論述,有興趣的同學可以通過末尾提供的學習資源彙總,自行檢視相關更加詳細的資料。

  • 一個原生的Linux容器格式,Docker中稱為libcontainer。

  • Linxu核心的名稱空間(namespace) , 用於隔離檔案系統、程序和網路。

  • 檔案系統隔離:每個容器都有自己的root檔案系統。

  • 程序隔離:每個容器都執行在自己的程序環境中。

  • 網路隔離:容器間的虛擬網路介面和IP地址都是分開的。

  • 資源隔離和分組:使用cgroups(即 control group, Linux的核心特性之一)將 CPU 和記憶體之類的資源獨立分配給每個Docker容器。

  • 寫時複製:檔案系統都是通過寫時複製建立的,這就意味著檔案系統是分層的、快速的,而且佔用的磁碟空間更小。

  • 日誌:容器產生的STDOUT、STDERR和 STDIN這些IO流都會被收集並記入日誌, 用來進行日誌分析和故障排錯。

  • 互動式shell:使用者可以建立一個偽tty終端,將其連線到STDIN ,為容器提供一個互動式的shell。

資料卷:資料持久保持、容器間共享和遷移

資料卷是一個可供容器使用的特殊目錄,它將主機作業系統目錄直接對映進容器,類似於Linux中的mount操作。

資料卷可以提供很多有用的特性,如下所示:

  • 資料卷可以在容器之間共享和重用,容器間傳遞資料將變得高效方便;

  • 對資料卷內資料的修改會立馬生效,無論是容器內操作還是本地操作;

  • 對資料卷的更新不會影響映象,解耦了應用和資料;

  • 卷會一直存在,直到沒有容器使用,可以安全地解除安裝它。

在用docker run命令的時候,使用-V標記可以在容器內建立一個數據卷。多次重複使用-v標記可以建立多個數據卷。

如果使用者需要在多個容器之間共享一些持續更新的資料,最簡單的方式是使用資料卷容器。資料卷容器也是一個容器,但是它的目的是專門用來提供資料卷供其他容器掛載。

首先,建立一個數據卷容器dbdata,並在其中建立一個數據卷掛載到/dbdata:

然後,可以在其他容器中使用--volumes-from來掛載dbdata容器中的資料卷,例如建立db1和db2兩個容器,並從dbdata容器掛載資料卷:

此時,容器db1和db2都掛載同一個資料捲到相同的/dbdata目錄。 三個容器任何一方在該目錄下的寫入,其他容器都可以看到。

容器網路技術:外部訪問與容器互聯

總體而言,在容器中大致可以通過以下幾種虛擬網路技術實現外部對於容器的訪問以及容器之間的互聯互通。

(1) 宿主機埠對映

在啟動容器的時候,如果不指定對應的引數,在容器外部是無法通過網路來訪問容器內的網路應用和服務的。

當容器中執行一些網路應用,要讓外部訪問這些應用時,可以通過-P或-p引數來指定埠對映。當使用-P(大寫的)標記時,Docker 會隨機對映一個49000~49900的埠到內部容器開放的網路埠:

(2)容器互聯

容器的互聯(linking)是一種讓多個容器中應用進行快速互動的方式。它會在源和接收容器之間建立連線關係,接收容器可以通過容器名快速訪問到源容器,而不用指定具體的IP地址。

使用--link引數可以讓容器之間安全地進行互動。

下面先建立一個新的資料庫容器:

然後建立一個新的web容器,並將它連線到db容器:

Docker相當於在兩個互聯的容器之間建立了一個虛機通道,而且不用對映它們的埠到宿主主機上。在啟動db容器的時候並沒有使用-p和-P標記,從而避免了暴露資料庫服務埠到外部網路上。

Docker通過兩種方式為容器公開連線資訊:

  • 更新環境變數;

  • 更新/etc/hosts檔案。

(3)使用Docker虛擬網橋

Docker啟動時會在主機上自動建立一個docker0虛擬網橋,實際上是一個Linux網橋,可以理解為一個軟體交換機,它會在掛載其上的介面之間進行轉發,如圖所示。

同時,Docker隨機分配一個本地未佔用的私有網段(在RFC1918 中定義)中的一個地址給docker0介面。比如典型的172.17.42.1,掩碼為255.255.0.0。此後啟動的容器內的網口也會自動分配一個同一網段(172.17.0.0/16)的地址。

當建立一個Docker容器的時候,同時會建立了一對veth pair介面(當資料包傳送到一個介面時,另外一個介面也可以收到相同的資料包)。這對介面一端在容器內,即eth0;另一端在本地並被掛載到docker0網橋,名稱以veth開頭(例如vethAQI2QT)。

通過這種方式,主機可以跟容器通訊,容器之間也可以相互通訊。如此一來,Docker就建立了在主機和所有容器之間一個虛擬共享網路。

除了預設的docker0網橋,使用者也可以指定網橋來連線各個容器。在啟動Docker服務的時候,使用-b BRIDGE或--bridge=BRIDGE來指定使用的網橋。

(4)libnetwork外掛化網路功能

從1.7.0版本開始,Docker正式把網路跟儲存這兩部分的功能實現都以外掛化形式剝離出來,允許使用者通過指令來選擇不同的後端實現。這也是Docker希望構建圍繞著容器的強大生態系統的一些積極的嘗試。

剝離出來的獨立容器網路專案叫libnetwork,從名字就能看出來,它希望將來為不同容器定義統一規範的網路層標準。事實上,這套網路虛擬化邏輯與Vmware等傳統虛擬化廠商的大致是一樣的。

libnetwork中容器網路模型(Container Networking Model,CNM)十分簡潔,可以讓上層使用網路的大量應用容器最大程度上不去關心底層實現。容器網路模型的結構如圖所示。

包括三種基本元素:

  • Sandbox(沙盒):代表一個容器(準確地說,是其網路名稱空間);

  • Endpoint(接入點):代表網路上可以掛載容器的介面,會分配IP地址;

  • Network可以連通多個接入點的一個子網。

可見,對於使用CNM的容器管理系統來說,具體底下網路如何實現,不同子網彼此怎麼隔離,有沒有QoS,都可以不關心。只要插 件能提供網路和接入點,只需把容器給接上或者拔下,剩下的都是外掛驅動自己去實現。這樣就解耦和容器和網路功能,十分靈活。

CNM的典型生命週期如下圖所示。首先,是驅動註冊自己到網路控制器,網路控制器使用驅動型別,來建立網路,然後在建立的網路上建立介面,最後把容器連線到介面上即可。銷燬過程則正好相反,先把容器從接入口上解除安裝,然後刪除接入口和網路即可。

目前CNM支援的驅動型別有四種:Null、Bridge、Overlay、Remote。簡單介紹如下:

  • Null:不提供網路服務,容器啟動後無網路連線;

  • Bridge:就是Docker傳統上預設用Linux網橋和Iptables實現的單機網路;

  • Overlay:是用vxlan隧道實現的跨主機容器網路;

  • Remote:擴充套件型別,預留給其他外部實現的方案,比如有一套第三方的SDN方案(如OpenStack Neutron),就可以接進來。

Dcokfile:建立映象

建立映象的方法主要有三種:基於已有映象的容器建立、基於本地模板匯入、基於Dockerfile建立。

建立Docker映象的第一種方法是使用docker com m it命令。可以將此想象為我們是在往版本控制系統裡提交變更。

使用者也可以直接從一個作業系統模板檔案匯入一個映象,主要使用docker import命令。命令格式為docker import[OPTIONS]file|URL|-[REPOSITORY[:TAG]]。

並不推薦使用 docker commit的方法來構建映象。相反,推薦使用被稱為 Dockerfile的定義檔案和docker build命令來構建映象。

Dockerfile使用基本的基於DSL (Domain Specific Language)) 語法的指令來構建一個Docker映象,推薦使用 Dockerfile方法來代替docker commit.因為通過前者來構建映象更具備可重複性、 透明性以及冪等性。

一旦有了 Dockerfile,我們就可以使用docker build命令基於該Dockerfile 中的指令構建一個新的映象。

Dockerfile由一行行命令語句組成,並且支援以#開頭的註釋行。 一般而言,Dockerfile分為四部分:基礎映象資訊、維護者資訊、映象操作指令和容器啟動時執行指令。例如:

其中,一開始必須指明所基於的映象名稱,接下來一般是說明維護者資訊。後面則是映象操作指令,例如RUN指令,RUN指令將對映象執行跟隨的命令。每執行一條RUN指令,映象就新增新的一層,並提交。最後是CMD指令,用來指定執行容器時的操作命令。

Dockerfile指令說明

Docker API

除了通過Docker客戶端與Docker引擎進行互動之外,Docker還支援通過API的方式來與Docker的各個元件進行互動,包括Docker Registry、Docker Hub和Docker 守護程序等。

在 Docker生態系統中一共有3 種 API。

  • Registry API:提供了與來儲存Docker映象的Docker Registry整合的功能。

  • Docker Hub API:提供了與 Docker Hub整合的功能。

  • Docker Remote API:提供與Docker守護程序進行整合的功能。

所有這3 種 API都是RESTful風格的。其中Remote API進是通過程式與Docker進行整合和互動的核心內容。

通過API我們可以實現Docker的幾乎全方位的管理,包括映象管理、容器管理、公有倉庫管理、註冊伺服器管理等,在大規模容器雲自動化管理、視覺化運維管理以及DevOps等場景中,尤其有用。

並且自Docker 的 0.9版本開始Docker Remote API開始提供了認證機制。這種認證機制採用了 TLS/SSL證書來確保使用者與API之間連線的安全性。

10 Docker命令彙總

一張圖總結Docker的命令

Docker與虛擬化

Docker為什麼能夠成功?

Docker實現的種種基礎技術(cgroups、namespace、分層檔案系統)在Docker之前已經存在很多年。並且,LXC也在諸多企業的生產環境中得到了大量的應用實踐,並得到了極為明顯的效能優勢。

Google大規模容器叢集的效能比傳統虛擬機器要高很多,接近於Bare Metal。與傳統虛擬機器相比,容器叢集讓這些公司擁有秒級而非分鐘級的彈性計算伸縮能力,同時使用更少的機器執行更多例項。

既然容器技術有如此大的優勢,為什麼Docker之前,容器並沒有引發廣泛的關注呢?核心的問題在於易用性,而Docker解決了這個問題。

Docker首次創造了一種簡單易行並且覆蓋應用全生命週期的工作流,使用者可以通過簡單的指令或Restful API來拉取、打包、執行和維護容器。這種簡化從根本上降低了應用程式部署的難度,極大地提高了應用執行時環境的部署與維護的效率。

使用者可以不依賴類似Ansible、Chef、Puppet這類的配置管理和釋出系統,不需要在部署中同時關注基礎系統與軟體的安裝配置,以及應用的安裝除錯。

Docker提供了一種統一的實踐方法,每個服務(或應用)維護一個Dockerfile檔案。即便使用編排工具如Docker Compose,一個服務(或應用)也只需維護一個docker-compose.yml檔案。應用程式及其執行時環境全部打包到一個簡單易讀的Dockerfile或Compose檔案中, 開發團隊和運維團隊都可以透明地合作維護這個檔案,極大降低了溝通成本與部署成本,極大滿足了研發團隊與DevOps團隊、運維團隊之間的溝通需求,清晰劃分了責任邊界。

Docker正以一種前所未有的方式讓使用者可以在各種Linux發行版、各種開發環境中快速切換,這對應用開發者來說真是一種福音。

使用各種開發環境的使用者,再也不必擔心破壞主機的系統環境(如環境變數)和應用程式。系統架構師們也可以使用Docker來快速搭建各種網路架構的系統,且可以方便地管理這些系統之間的資料連線和共享。

目前Docker發展迅速,基於Docker的PaaS平臺也層出不窮。這讓技術創業者無需折騰伺服器部署,只需專注業務程式碼的實現即可。

真正解決使用者痛點,真正帶來效率的提升,是一個產品和技術能最終成功的關鍵!

Docker與虛擬化的區別

兩者的架構區別如下:

前人總結的兩者的主要區別如下:

關於Docker是否能夠取代虛擬化,是個被討論很久的問題,個人愚見:虛擬化和Docker並不是對立與相互取代的關係,場景化需求才是兩種技術選擇的關鍵。

虛擬機器和容器技術本身並不對立,也不存在誰取代誰的問題,關鍵是企業是否合理運用技術在合理的應用場景當中解決相應的技術問題,未來的企業級雲平臺也應該囊括對這些技術的支援,以滿足企業對不同業務所需不同技術棧的靈活選擇!

關於這一點,我們後面還有文章深度探討。

事實上,Docker技術極大的改變了企業建設應用系統的流程和生態,Docker本身也與虛擬化、微服務架構、DevOps、自動化運維等之間有著千絲萬縷的聯絡。

我們將在後續的文章中,繼續探討兩個問題:

  1. Docker容器技術在可見的未來,比如3-5年,能夠完全取代虛擬化技術嗎?

  2. Docker與微服務、DevOps之間有怎樣的關係?它們如何一起改變了企業應用開發的生態和工作流程?

附錄:Docker學習資源彙總

Docker官方主頁

http://www.docker.com/

Docker Hub

http://hub.docker.com

Docker官方部落格

http://blog.docker.com/

Docker官方文件

http://docs.docker.com/

Docker快速入門指南

https://www.docker.com/tryit/

Docker的GitHub原始碼

https://github.com/docker/docker

Docker Forge:收集了各種Docker工具、元件和服務

https://github.com/dockerforge

Docker郵件列

https://groups.google.com/forum/#!forum/docker-user

Docker的IRC頻道

irc.freenode.net

Docker的Twitter主頁

http://twitter.com/docker

Docker的StackOverflow問答主頁

http://stackoverflow.com/search?q=docker

金秋十月,是適合學習的好日子。

2018藍鯨智雲分享會正在報名中,如何打造堅實的自動化運維基礎,如何穩步向資料化運維邁進,如何全方位推動研發運營一體化,我們共同探討。

報名請戳如下連結:

10月23日上海站:https://www.bagevent.com/event/1904525

10月25日北京站:https://www.bagevent.com/event/1908569

10月30日廣州站:https://www.bagevent.com/event/1908633

10月31日深圳站:https://www.bagevent.com/event/1908650

轉載請註明出處。​​​​