天天看點

Docker 基礎知識 - Docker 概述

Docker 是一個開發、釋出和運作應用程式的開放平台。Docker使您能夠将應用程式與基礎架構分離,以便快速傳遞軟體。有了 Docker,你可以像管理應用程式一樣管理你的基礎設施。通過利用 Docker 快速釋出、測試和部署代碼的方法,您可以顯著減少編寫代碼和在生産環境中運作它之間的延遲。

Docker 平台

Docker 提供了在松散隔離的環境(稱為容器)中打包和運作應用程式的能力。隔離和安全性允許您在給定的主機上同時運作多個容器。容器是輕量級的,因為它們不需要額外的hypervisor負載,而是直接在主機的核心中運作。這意味着您可以在給定的硬體組合上運作比使用虛拟機時更多的容器。你甚至可以在實際是虛拟機的主機中運作 Docker 容器!

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

  • 使用容器開發應用程式及其支援元件。
  • 容器成為分發和測試應用程式的單元。
  • 準備就緒後,将應用程式作為容器或編排好的服務部署到生産環境中。無論您的生産環境是本地資料中心、雲提供商還是兩者的混合,操作都是一樣的。

Docker 引擎

Docker 引擎是一個 用戶端-伺服器 應用程式,具有以下主要元件:

  • 一個伺服器,它是一種稱為守護程序(

    dockerd

    指令)的長時間運作程式。
  • 一個 REST API,它指定程式可以用來與守護程序對話并訓示它做什麼的接口。
  • 一個指令行界面(CLI)用戶端(

    docker

    指令)。
Docker 基礎知識 - Docker 概述

CLI 使用Docker REST API通過腳本或直接CLI指令控制Docker守護程序或與之互動。

許多其他Docker應用程式使用底層API和CLI。

這個守護程序建立和管理 Docker 對象,如鏡像、容器、網絡和卷(images, containers, networks, and volumes)。

注意: Docker使用的是開源 Apache 2.0 許可證。

有關更多細節,請參閱下面的 Docker 架構。

我可以用 Docker 做什麼?

快速、一緻地傳遞應用程式

Docker 允許開發人員使用提供應用程式和服務的本地容器,在标準化的環境中工作,進而簡化了開發生命周期。容器對于持續內建和持續傳遞(CI/CD)工作流非常有用。

考慮以下示例場景:

  • 開發人員在本地編寫代碼,并使用 Docker 容器與同僚共享他們的工作。
  • 他們使用 Docker 将應用程式推送到測試環境,并執行自動和手動測試。
  • 當開發人員發現 bug 時,他們可以在開發環境中修複它們,并将它們重新部署到測試環境中進行測試和驗證。
  • 當測試完成時,向客戶提供修複就像将更新後的鏡像推送到生産環境一樣簡單。

響應式部署和擴充

Docker 的基于容器的平台允許高度可移植的工作負載。Docker 容器可以運作在開發人員的本地筆記本電腦上、資料中心的實體或虛拟機上、雲提供商上或在混合的環境中。

Docker 的可移植性和輕量級性質也使得它可以很容易地動态管理工作負載,根據業務需要,在接近實時的情況下擴充或拆除應用程式和服務。

在相同硬體上運作更多工作負載

Docker 是輕量級和快速的。它為基于管理程式的虛拟機提供了一種可行的、經濟有效的替代方案,是以您可以使用更多的計算能力來實作業務目标。Docker 非常适合高密度環境和中小型部署,在這些環境中,您需要用更少的資源做更多的事情。

Docker 架構

Docker 使用用戶端-伺服器架構。Docker 用戶端與 Docker 守護程序通信,後者負責建構、運作和分發Docker 容器等繁重的工作。Docker 用戶端和守護程序可以運作在同一個系統上,或者您可以将一個 Docker 用戶端連接配接到一個遠端 Docker 守護程序。Docker 用戶端和守護程序通過 UNIX 套接字或網絡接口使用 REST API 進行通信。

Docker 基礎知識 - Docker 概述

Docker 守護程序

Docker 守護程序(

dockerd

)偵聽 Docker API 請求并管理 Docker 對象,如鏡像、容器、網絡和卷。

守護程序還可以與其他守護程序通信來管理 Docker 服務。

Docker 用戶端

Docker 用戶端(

docker

)是許多 Docker 使用者與 Docker 互動的主要方式。當您使用諸如

docker run

之類的指令時,用戶端将這些指令發送給

dockerd

,

dockerd

會執行這些指令。

docker

指令使用 Docker API。Docker 用戶端可以與多個守護程序通信。

Docker 系統資料庫

Docker 系統資料庫存儲 Docker 鏡像。

Docker Hub 是一個任何人都可以使用的公共系統資料庫,預設情況下 Docker 被配置為在 Docker Hub 上尋找鏡像。您甚至可以運作自己的私有系統資料庫。如果您使用 Docker 資料中心(DDC),它包括 Docker 可信系統資料庫(DTR)。

當您使用

docker pull

docker run

指令時,所需的鏡像将從配置的系統資料庫中拉取。當您使用

docker push

指令時,您的鏡像将被推送到您配置的系統資料庫中。

Docker 對象

當您使用 Docker 時,您正在建立和使用鏡像、容器、網絡、卷、插件和其他對象。本節簡要介紹其中一些對象。

鏡像(IMAGES)

鏡像是一個隻讀模闆,帶有建立 Docker 容器的指令。鏡像通常基于另一個鏡像,并進行一些額外的定制。例如,您可以建構基于 ubuntu 鏡像的鏡像,但是安裝了 Apache web server 和您的應用程式,以及運作應用程式所需的配置細節。

您可以建立自己的鏡像,也可以隻使用其他人建立并釋出在系統資料庫中的鏡像。要建構自己的鏡像,需要建立一個 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)

服務允許您跨多個 Docker 守護程序擴充容器,這些守護程序組成一個叢集,多個管理者和工作者一起工作。一個叢集的每個成員都是一個 Docker 守護程序,所有的守護程序都使用 Docker API 進行通信。服務允許您定義所需的狀态,例如在任何給定時間必須可用的服務副本的數量。預設情況下,服務在所有工作節點之間進行負載均衡。對于消費者來說,Docker 服務看起來像一個單獨的應用程式。Docker 引擎在 Docker 1.12 及更高的版本支援叢集模式。

底層技術

Docker 是用 Go 編寫的,并利用 Linux 核心的幾個特性來實作其功能。

命名空間

Docker 使用名為命名空間的技術來提供稱為容器的隔離工作區。當您運作一個容器時,Docker 為該容器建立一組命名空間。

這些命名空間提供了一個隔離層。容器的每個方面都在一個單獨的命名空間中運作,其通路權限僅限于該命名空間。

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

  • pid

    命名空間: 程序隔離 (PID: 程序ID)。
  • net

    命名空間: 管理網絡接口 (NET: Networking)。
  • ipc

    命名空間: 管理對 IPC 資源的通路 (IPC: 程序間通信)。
  • mnt

    命名空間: 管理檔案系統挂載點 (MNT: Mount)。
  • uts

    命名空間: 隔離核心辨別符和版本辨別符 (UTS: Unix分時系統)。

控制組

Linux 上的 Docker 引擎還依賴于另一種稱為控制組(cgroups)的技術。cgroup 将應用程式限制為特定的資源集。控制組允許 Docker 引擎将可用的硬體資源共享給容器,并可以選擇強制限制和限制。例如,可以限制特定容器的可用記憶體。

聯合檔案系統

聯合檔案系統,或 UnionFS,是通過建立層來操作的檔案系統,使其非常輕便和快速。Docker 引擎使用 UnionFS 為容器提供建構塊。Docker 引擎可以使用多種 UnionFS 變體,包括 AUFS、btrfs、vfs 和 DeviceMapper。

容器格式

Docker 引擎将命名空間、控制組和 UnionFS 組合到一個稱為容器格式的包裝器中。預設的容器格式是

libcontainer

。未來,Docker 可能會通過與 BSD Jails 或 Solaris Zones 等技術內建來支援其他容器格式。

作者 : Docker 官網

譯者 : 技術譯民

出品 : 技術譯站

連結 : 英文原文

© 轉載請标明出處   https://www.cnblogs.com/ittranslator

不做标題黨,隻分享技術幹貨

公衆号『技術譯站』,

歡迎掃碼關注
Docker 基礎知識 - Docker 概述