一葉障目 —— docker

本篇文章來自docker官方文檔的翻譯
主要內容包括docker的作用,架構,底層技術概覽

Docker overview

大約閱讀時間:10

Docker是一個用於開發,交付和運行應用程序的開放平臺。 Docker使您能夠將應用程序與基礎架構(環境配置)分開,從而可以快速交付軟件。 藉助Docker,您可以和管理應用程序相同的方式來管理基礎架構(環境配置)。 通過利用Docker的方法來快速交付,測試和部署代碼,可以方便編寫代碼和在生產環境中運行代碼。


Docker平臺

Docker提供了在鬆散隔離的環境(稱爲容器)中打包和運行應用程序的功能。隔離和安全性使您可以在給定主機上同時運行多個容器。容器輕巧,因爲它們不需要 hypervisor 的額外負擔,而是直接在主機的內核中運行。這意味着與使用虛擬機相比,您可以在給定的硬件組合上運行更多的容器。甚至可以在實際上是虛擬機的主機中運行Docker容器!

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

  • 使用容器開發應用程序及其支持組件。
  • 容器成爲分發和測試應用程序的單元。
  • 準備就緒後,可以將應用程序作爲容器或協調服務部署到生產環境中。無論您的生產環境是本地數據中心,雲提供商還是兩者的混合,其工作原理都相同。

Docker Engine

Docker Engine 是具有以下主要組件的客戶端-服務器應用程序:

  • docker daemon 是一種長期運行的程序,稱爲守護程序進程(dockerd命令)。
  • REST API,用於指定程序可用於與守護程序進行通信並指示其操作的接口。
  • 命令行界面(CLI)客戶端( ``docker’ 命令)。

https://docs.docker.com/engine/images/engine-components-flow.png

CLI 使用 Docker REST API 通過腳本或直接 CLI 命令控制或與 Docker 守護程序交互。 許多其他 Docker 應用程序都使用基礎 API 和 CLI。

守護進程創建和管理 Docker 對象,例如鏡像,容器,網絡和存儲卷。

注意:Docker已獲得開源Apache 2.0許可證的許可。

有關更多詳細信息,請參見下面的 Docker架構

Docker有什麼用?

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

Docker通過讓開發人員運行本地容器(標準環境中運行應用程序以及服務),從而簡化了開發生命週期。容器非常適合持續集成和持續交付(CI / CD)工作流。

考慮以下場景:

  • 開發人員在本地編寫代碼,並使用Docker容器與同事共享。
  • 他們使用Docker將其應用程序推送到測試環境中,並執行自動和手動測試。
  • 當開發人員發現錯誤時,可以在開發環境中對其進行修復,然後將其重新部署到測試環境中以進行測試和驗證。
  • 測試完成後,簡單的通過將更新的鏡像推送到生產環境,就可以交付給客戶了

響應式部署和擴展

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

Docker的可移植性和輕量級的特性還使您可以輕鬆地動態管理工作棧,並根據業務需求指示實時擴展或縮減應用程序和服務。

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

Docker輕巧快速。它爲基於虛擬機管理程序的虛擬機提供了可行且經濟高效的替代方案,因此可以利用更多的計算能力來實現業務目標。 Docker非常適合高密度環境和中小型部署,用更少的資源做更多的事情。

Docker架構

Docker使用客戶端-服務器架構。 Docker 客戶端Docker daemon 對話,後者會大量構建,運行和分發Docker容器。 Docker客戶端和 docker daemnon可以在同一系統上運行,或者可以將 Docker 客戶端連接到遠程 Docker daemon。 Docker客戶端和 daemonUNIX sockests或網絡接口上使用 REST API 進行通信。

https://docs.docker.com/engine/images/architecture.svg

The Docker daemon

Docker daemon(dockerd)監聽 Docker API 請求並管理 Docker 對象,例如鏡像,容器,網絡和卷。daemon 還可以與其他 daemon 通信以管理 Docker 服務。

Docker客戶端

Docker客戶端(docker)是許多 Docker 用戶與 Docker 交互的主要方式。當你使用諸如 docker run 之類的命令時,客戶端會將這些命令發送至dockerd,後者將其執行。 docker命令使用Docker API。 Docker客戶端可以與多個守護程序通信。

Docker註冊表

Docker 註冊表存儲 Docker images。 Docker Hub 是任何人都可以使用的公共註冊表,並且 Docker 默認配置爲在 Docker Hub 上查找鏡像。你也可以運行自己的私人註冊表。如果使用Docker Datacenter(DDC),則其中包括Docker Trusted Registry(DTR)。

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

Docker對象

使用Docker時,你正在創建和使用鏡像,容器,網絡,卷,插件和其他對象。這篇文章是其中一些對象的簡要概述。

鏡像(images)

docker image是一個只讀模板,其中包含創建Docker容器的說明。通常,一個鏡像基於另一個鏡像,並進行一些其他自定義。例如,您可以基於ubuntu鏡像構建鏡像,但是額外自定義安裝Apache Web服務器和應用程序以及運行應用程序所需的配置詳細信息。

您可以創建自己的鏡像,也可以只使用其他人創建並在註冊表中發佈的鏡像。要構建自己的進行,可以使用簡單的語法創建 Dockerfile,用來定義創建鏡像並運行它所需的步驟。 Dockerfile中的每條指令都會在鏡像中創建一個層。更改Dockerfile並重建鏡像時,僅重建那些已更改的層。與其他虛擬化技術相比,這是使鏡像如此輕巧,小型和快速的部分原因。

容器(containers)

容器是鏡像的可運行實例。你可以使用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創建一個網絡接口以將容器連接到默認網絡,這包括爲容器分配IP地址。默認情況下,容器可以使用主機的網絡連接連接到外部網絡。
  5. Docker啓動容器並執行/ bin / bash。由於容器是交互式運行的並且已附加到您的終端(由於-i和-t),因此您可以在輸出記錄到終端時使用鍵盤提供輸入。
  6. 當鍵入exit終止/ bin / bash命令時,該容器停止但未被移除。你可以重新啓動或刪除它。

服務 (services)

Services可以在多個Docker daemons之間擴展容器,多個services一起工作稱爲swarm可以與多個manager worker 一起協同工作。一個 swarm 的每個成員都是一個Docker daemon,並且所有 daemon 都使用Docker API進行通信。一個service允許定義所需的狀態,例如在任何給定時間必須可用的服務副本數。默認情況下,該服務在所有工作節點之間負載平衡。對於消費者而言,Docker服務似乎是一個單獨的應用程序。 Docker Engine在Docker 1.12及更高版本中支持 swarm 模式。

底層技術

Docker用Go編寫,並利用Linux內核的多種功能來提供其功能。

命名空間(Namespaces)

Docker使用一種名爲namespaces的技術來提供稱爲 container 的隔離工作區。運行容器時,Docker會爲該容器創建一組 namespaces

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

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

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

Control groups

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

Union file systems

Union file systems 或 UnionFS 是通過創建層進行操作的文件系統,使其非常輕便且快速。 Docker Engine使用UnionFS爲容器提供構建模塊。 Docker Engine可以使用多種UnionFS,包括AUFS,btrfs,vfs和DeviceMapper。

Container format

Docker Engine將namespaces,control groups 和 UnionFS 組合到一個稱爲container format的包裝器中。默認的container format是libcontainer。將來,Docker可以通過與BSD Jails或Solaris Zones等技術集成來支持其他 container format。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章