Docker概述篇

我想以這篇文章做爲Docker的開篇,如下內容均來自Docker官方文檔,應該沒有比官方文檔更能形象生動的描述Docker了。web

Docker 概述docker

Docker是一個開發、發佈和運行應用程序的開放平臺。Docker使您可以將應用程序與基礎架構分離,以便快速交付軟件。有了Docker,你能夠像管理應用程序同樣管理你的基礎設施。經過利用Docker快速發佈、測試和部署代碼的方法,您能夠顯著減小編寫代碼和在生產環境中運行代碼之間的延遲。ubuntu

Docker平臺安全

Docker提供了在容器中打包和運行應用程序的能力。隔離和安全性容許您在給定的主機上同時運行多個容器。容器是輕量級的,由於它們不須要加載額外的hypervisor,而是直接在宿主機的內核中運行。這意味着您能夠在給定的硬件組合上運行比使用虛擬機時更多的容器。你甚至能夠在實際是虛擬機的主機中運行Docker容器!bash

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

一、使用容器開發應用程序及其支持組件。網絡

二、容器成爲分發和測試應用程序的單元。架構

三、準備好後,將應用程序做爲容器或編排的服務部署到生產環境中。不管您的生產環境是本地數據中心、雲提供商仍是二者的混合體,這都是同樣的。app

Docker 引擎ide

Docker Engine是一個客戶端-服務器應用程序,具備如下主要組件:

一、一種被稱爲守護進程(dockerd)的長時間運行程序的服務器。

二、REST API,它指定了接口來告訴應用程序如何與守護進程進行交互。

命令行界面(CLI)客戶端(docker命令),以下圖1.1所示。

7af8c5ad3f1f4e638181f165391d5914

圖1.1

CLI使用Docker REST API經過腳本或直接CLI命令來控制Docker守護進程或與之交互。許多其餘Docker應用程序使用底層API和CLI。

使用守護進程來建立並管理Docker對象,如鏡像、容器、網絡和卷。

注意:Docker是基於Apache2.0開源許可受權。

更多細節見下面的Docker架構。

我能夠用Docker作什麼?

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

Docker經過容許開發人員在標準化環境中使用本地容器(提供應用程序和服務)來簡化開發週期。容器很是適合作持續集成和持續交付(CI/CD)工做流。

考慮如下示例場景:

開發人員在本地編寫代碼,並使用Docker容器與同事共享他們的工做。

他們使用Docker將應用程序推入測試環境,並執行自動化和手動測試。

當開發人員發現bug時,他們能夠在開發環境中修復它們,並將它們從新部署到測試環境中進行測試和驗證。

測試完成後,將更新後的鏡像推送到生產環境中就能夠簡單地爲客戶得到修復。

響應式部署和擴容

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

Docker的可移植性和輕量級特性也使得動態管理工做負載、根據業務需求擴容或收縮應用程序和服務變得很是容易,幾乎是實時的。

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

Docker是輕量並快速的。它爲基於hypervisor的虛擬機提供了一個可行、經濟的替代方案,所以您可使用更多的計算能力來實現業務目標。Docker很是適合高密度環境和中小型部署,在這些環境中,您須要用更少的資源作更多的事情。

Docker架構

Docker使用C-S架構。Docker客戶端與Docker守護進程通訊,Docker守護進程負責構建、運行和分發Docker容器。Docker客戶端和守護進程能夠在同一個系統上運行,也能夠將Docker客戶端鏈接到遠程Docker守護進程。Docker客戶端和守護進程使用REST API,經過UNIX Socket(套接字)或網絡接口進行通訊,如圖1.2所示。

f28039ecbb9c4ba3a4fe8f4fa51d1655

圖1.2

Docker守護進程

Docker守護進程(dockerd)監聽Docker API的請求並管理Docker對象,如鏡像(images)、容器(containers)、網絡(networks)和卷(volumes)。守護進程還能夠與其餘守護進程通訊以管理Docker服務。

Docker客戶端

Docker客戶端(docker)是許多Docker用戶與Docker進行交互的主要方式。當您使用docker run等命令時,客戶端會將這些命令發送給dockerd,dockerd會執行這些命令。docker命令使用docker API。Docker客戶端能夠與多個docker守護進程通訊。

Docker registry

Docker registry用來存儲Docker鏡像。Docker Hub是任何人均可以使用的公共registry,Docker默認配置爲在Docker Hub上查找鏡像。您能夠運行本身的私有registry。若是您使用Docker數據中心(DDC),它包括Docker Trusted Registry(DTR)。

使用docker pull或docker run命令時,將從配置的registry中提取所需的鏡像。使用docker push命令時,鏡像將被推送到配置的registry中。

Docker對象

當您使用Docker時,您可能正在建立和使用鏡像、容器、網絡、卷、插件和其餘對象。

鏡像(image)

鏡像是一個只讀模板,包含了建立Docker容器的指導說明。一般,一個鏡像基於另外一個鏡像,並帶有一些額外的自定義項。例如,您能夠構建一個鏡像,它是基於ubuntu鏡像,而後再安裝Apache web服務器和您的應用程序,並作相關詳細配置確保應用能運行。

您也能夠建立本身的鏡像,也能夠只使用其餘人建立並在docker hub registry中發佈的鏡像。要構建本身的鏡像,須要建立一個Dockerfile,其中包含一些簡單的語法,用於定義建立鏡像並運行它所需的步驟。Dockerfile中的每條指令都會在鏡像中建立一個層。更改Dockerfile並從新生成鏡像時,僅從新生成已更改的層。與其餘虛擬化技術相比,這是使鏡像如此輕量級、小型和快速的緣由之一。

容器(container)

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

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

容器由其鏡像以及建立或啓動時提供給它的任何配置選項定義。當容器被刪除時,對其狀態的任何未存儲在持久性存儲中的更改都將丟失,即建立容器時咱們要先規劃好確保有用數據是放在持久化的存儲上。

docker run命令示例

下面的命令將運行一個ubuntu容器,以交互方式鏈接到本地命令行會話,並運行/bin/bash。

運行此命令時,將發生如下狀況(假設使用的是默認registry配置):

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

一、若是你本地沒有ubuntu鏡像,Docker會從你配置的registry中去找,就像手動運行Docker pull ubuntu同樣。

二、Docker建立了一個新的容器,就像您手動運行了Docker container create命令同樣。

三、Docker爲容器分配了一個可讀寫的文件系統,做爲容器的最後一層。容許在正在運行的容器上建立或修改文件和目錄。

四、Docker會建立一個網絡接口,若是您沒有指定任何網絡選項,容器將鏈接到默認網絡。這包括爲容器分配IP地址。默認狀況下,容器可使用主機的網絡鏈接鏈接到外部網絡。

五、Docker啓動容器並執行/bin/bash。容器將以交互方式運行並鏈接到您的終端。

六、當您鍵入exit,將終止/bin/bash,容器會中止,但不會被刪除。您能夠從新啓動或刪除它。

服務

服務容許您跨多個Docker守護進程擴展容器,全部這些守護進程都與多個管理進程和工做進程協同工做。swarm的每一個成員都是Docker守護進程,全部守護進程都使用Docker API進行通訊。服務容許您定義所需的狀態,例如在任何給定時間必須可用的服務副本的數量。默認狀況下,服務在全部工做節點上都是負載平衡的。對於消費者來講,Docker服務彷佛是一個單獨的應用程序。Docker引擎要支持swarm模式,須要Docker1.12及更高版本。

基礎技術

Docker採用Go語言編寫,而且利用了Linux內核的一些高級特性來提供功能。

命名空間(Namespaces)

Docker使用命名空間(namespaces)技術來給容器提供獨立的工做空間。當您運行一個容器時,Docker會爲該容器建立一組命名空間。

這些命名空間提供了一個隔離層,容器的各個資源都分別在一個單獨的命名空間中運行,其訪問權限僅限於該命名空間。

Docker Engine在Linux上使用以下名稱空間:

pid 命名空間:進程隔離(pid:Process ID)。

net 命名空間:管理網絡接口(net:Networking)。

ipc 命名空間:管理對ipc資源的訪問(ipc:InterProcess Communication)。

mnt 命名空間:管理文件系統掛載點(mnt:mount)。

uts 命名空間:隔離內核和版本標識符。(UTS: Unix Timesharing System)。

控制組(Control groups)

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

聯合文件系統(Union file systems)

聯合文件系統(UnionFS)是經過建立層來操做的文件系統,這使得它們很是輕量和快速。Docker引擎使用UnionFS爲容器提供構建塊。Docker引擎可使用多個UnionFS變體,包括AUFS、btrfs、vfs和DeviceMapper。

容器格式(Container format)

Docker引擎將命名空間、控制組和UnionFS組合成一個稱爲容器格式的封裝套件。默認的容器格式是libcontainer。將來,Docker可能會經過與BSD Jails或Solaris Zones等技術集成來支持其餘容器格式。

相關文章
相關標籤/搜索