Docker概覽

Docker是一個用於開發,交付和運行應用程序的開放平臺。 Docker使您可以將應用程序與基礎設施分開,從而能夠快速交付軟件。 藉助Docker,您能夠以管理應用程序相同的方式來管理基礎設施。 經過利用Docker的方法來快速交付,測試和部署代碼,您能夠大大減小編寫代碼和在生產環境中運行代碼之間的延遲。golang

Docker平臺

Docker提供了在鬆散隔離的環境(稱爲容器)中打包和運行應用程序的功能。隔離和安全性使您能夠在給定主機上同時運行多個容器。容器很輕,由於它們不須要加載額外的管理程序,而是直接在主機的內核中運行。這意味着與使用虛擬機相比,能夠在給定的硬件組合上運行更多的容器。您甚至能夠在其實是虛擬機的主機中運行Docker容器!docker

Docker提供了工具和平臺來管理容器的生命週期:ubuntu

  • 使用容器開發應用程序及其支持組件。
  • 容器成爲分發和測試應用程序的單元。
  • 準備就緒後,能夠將應用程序做爲容器或精心安排的服務部署到生產環境。不管您的生產環境是本地數據中心、雲提供商仍是二者的混合,都是同樣的。

Docker引擎

Docker引擎是客戶端-服務器應用程序,具備如下主要組件:安全

  • 服務器是一種長期運行的程序,稱爲後臺程序(dockerd命令)。
  • REST API,它指定了一些接口,程序能夠用來與後臺程序進行通訊並指示其操做。
  • 客戶端命令行接口(CLI)(docker命令)。

Docker引擎組件

CLI使用Docker REST API控制Docker後臺程序或與Docker後臺程序進行交互,經過腳本或直接經過CLI命令。 許多其餘Docker應用程序都使用底層API和CLI。bash

後臺程序建立和管理Docker對象,例如鏡像,容器,網絡和卷。服務器

注意:Docker以Apache 2.0 license許可開源。網絡

能夠用Docker幹什麼?

快速,一致地交付您的應用程序

Docker簡化了開發流程,容許開發人員使用標準化環境,把應用程序和服務放到本地容器中工做。容器很是適合持續集成和持續交付(CI/CD)工做流程。架構

請考慮如下示例場景:app

  • 開發人員在本地編寫代碼,並使用Docker容器與同事共享他們的工做。
  • 他們使用Docker將其應用程序推送到測試環境中,並執行自動和手動測試。
  • 當開發人員發現錯誤時,他們能夠在開發環境中對其進行修復,而後將其從新部署到測試環境中以進行測試和驗證。
  • 測試完成後,簡單的把更新的鏡像推送到生產環境。

響應式部署和擴展

Docker是基於容器的平臺容許高度可移植的工做負載。 Docker容器能夠在開發人員的本地筆記本電腦上,數據中心中的物理或虛擬機上,雲提供商上或混合環境中運行。負載均衡

Docker的可移植性和輕量級的特性還使您能夠輕鬆地動態管理工做負載,並根據業務需求指示伸縮應用程序和服務,幾乎是實時的。

在同一硬件上運行更多工做負載

Docker輕巧快速。 它是基於虛擬機管理程序的虛擬機,的一個經濟高效的替代方案,所以您能夠利用更多的計算能力來實現業務目標。 Docker很是適合於高密度環境以及中小型部署,而您須要用更少的資源作更多的事情。

Docker架構

Docker使用客戶端-服務器架構。 Docker客戶端與Docker後臺程序之間能夠相互通訊,後臺程序完成了構建,運行和分發Docker容器的繁重工做。 Docker客戶端和後臺程序能夠在同一系統上運行,也能夠將Docker客戶端鏈接到遠程Docker守護程序。 Docker客戶端和守護程序在UNIX套接字或網絡接口上使用REST API進行通訊。

architecture.svg

後臺程序

Docker後臺程序(dockerd)監聽Docker API請求並管理Docker對象,例如鏡像,容器,網絡和卷。 後臺程序還能夠與其餘後臺程序通訊以管理Docker服務。

Docker客戶端

Docker客戶端(docker)是Docker用戶與Docker交互的主要方式。 當您使用諸如docker run之類的命令時,客戶端會將這些命令發送至dockerd,而後執行它們。 docker命令使用Docker API。 Docker客戶端能夠與多個後臺程序通訊。

Docker註冊中心

Docker註冊中心存儲Docker鏡像。 Docker Hub是任何人均可以使用的公共註冊中心,而且默認狀況下,Docker已配置爲在Docker Hub上查找鏡像。 您甚至能夠運行本身的私人註冊中心。 若是使用Docker數據中心(DDC),則其中包括Docker可信註冊中心(DTR)。

使用docker pulldocker run命令時,所需的鏡像將從配置的註冊中心拉取。 使用docker push命令時,會將鏡像推送到配置的註冊中心。

Docker對象

使用Docker時,您正在建立和使用鏡像,容器,網絡,卷,插件和其餘對象。本節是其中一些對象的簡要概述。

鏡像

鏡像是一個只讀模板,其中包含建立Docker容器的指令。一般,一個鏡像基於另外一個鏡像,並進行一些定製。例如,您能夠構建基於ubuntu的鏡像,並安裝Apache Web服務器和您的應用程序,以及運行應用程序所需的配置信息。

您能夠建立本身的鏡像,也可使用其餘人在註冊中心發佈的鏡像。要構建本身的鏡像,您可使用簡單的語法建立一個Dockerfile,定義建立鏡像所需的步驟。 Dockerfile中的每一個指令都會在鏡像中建立一個層。當您更改Dockerfile並重建鏡像時,僅重建那些已更改的層。與其餘虛擬化技術相比,這是使鏡像如此輕巧,小型和快速的部分緣由。

容器

容器是鏡像的可運行實例。您可使用Docker API或CLI建立,啓動,中止,移動或刪除容器。您能夠將容器鏈接到一個或多個網絡,附加存儲,甚至根據其當前狀態建立新鏡像。

默認狀況下,容器與其餘容器及其主機之間的隔離程度相對較高。您能夠控制容器的網絡,存儲或其餘底層子系統與其餘容器或主機之間的隔離程度。

容器由鏡像以及在建立或啓動時提供的配置定義。刪除容器後,未存儲在持久性存儲中的狀態更改將消失。

docker run 命令示例

如下命令運行ubuntu容器,並以交互方式附加到本地命令行會話,而後運行/bin/bash

$ docker run -i -t ubuntu /bin/bash

當您運行此命令時,會發生如下狀況(假設您使用的是默認註冊中心配置):

  1. 若是本地沒有ubuntu鏡像,則Docker會將其從配置的註冊中心拉取,等同於您手動運行docker pull ubuntu

  2. Docker建立了一個新容器,等同於您手動運行docker container create命令。

  3. Docker將一個讀寫文件系統分配給容器,做爲其最後一層。這容許運行中的容器在其本地文件系統中建立或修改文件和目錄。

  4. Docker建立了一個網絡接口,將容器鏈接到默認網絡,由於您未指定任何網絡選項。默認狀況下,容器可使用主機的網絡鏈接鏈接到外部網絡。

  5. Docker啓動容器並執行/bin/bash。由於容器是交互式運行的,而且已附加到您的終端(因爲-i-t標記),因此您可使用鍵盤輸入命令。

  6. 當您輸入exit終止/bin/bash命令時,該容器將中止但不會被刪除。您能夠從新啓動或刪除它。

服務

服務使您能夠在多個後臺程序之間擴展容器,這些後臺程序一塊兒工做組成一個swarm集羣,包括多個管理端和工做端。 swarm集羣的每一個成員都是Docker後臺程序,而且全部後臺程序都使用Docker API進行通訊。服務容許您定義所需的狀態,例如在任何給定時間必須可用的服務副本的數量。 默認狀況下,該服務在全部工做節點之間實現負載均衡。 對於消費者而言,Docker服務就像是一個單獨的應用程序。 Docker Engine在Docker 1.12及更高版本上支持swarm集羣模式。

底層實現

Docker用Go編寫,並利用Linux內核的多個功能來實現其功能。

命令空間(namespace)

Docker使用一種稱爲命名空間的技術來提供稱爲容器的隔離工做區。 運行容器時,Docker會爲該容器建立一組命名空間。

這些命名空間提供了一層隔離。 容器的全部方面都在單獨的命名空間中運行,而且對其的訪問僅限於該命名空間。

Docker Engine在Linux上使用如下命名空間:

pid命名空間:進程隔離(PID:進程ID)。 net命名空間:管理網絡接口(NET:網絡)。 ipc命名空間:管理對IPC資源的訪問(IPC:進程間通訊)。 mnt命名空間:管理文件系統掛載點(MNT:掛載)。 uts命名空間:隔離內核和版本標識符。 (UTS:Unix時間共享系統)。

控制組(Control groups)

Linux上的Docker引擎還依賴於另外一種稱爲控制組(cgroups)的技術。 cgroup將應用程序限制在一組特定的資源上。控制組容許Docker引擎將可用的硬件資源共享給容器,並有選擇地實施限制和約束。例如,您能夠限制特定容器可用的內存。

聯合文件系統(Union file systems)

聯合文件系統或UnionFS是經過建立層進行操做的文件系統,使其很是輕便且快速。 Docker Engine使用UnionFS爲容器提供構建模塊。 Docker Engine可使用多個UnionFS變體,包括AUFS,btrfs,vfs和DeviceMapper。

容器格式

Docker Engine將命名空間,控制組和UnionFS組合到一個稱爲容器格式的包裝器中。默認容器格式爲libcontainer。未來,Docker可能會經過集成BSD Jails或Solaris Zones等技術來支持其餘容器格式。

下一步

相關文章
相關標籤/搜索