天天看點

Docker 基礎

Docker 是一個開源的應用容器引擎,基于 Go 語言,并遵從Apache2.0協定開源,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後釋出到任何流行的 Linux或Windows 機器上,也可以實作虛拟化。容器是完全使用沙箱機制,互相之間不會有任何接口。

Docker(Docker 引擎)

元件構成:

Docker 用戶端(Docker Client)

Docker 守護程序(Docker daemon)

(細分為

containerd

shim

以及

runc

)。它們共同負責容器的建立和運作。

Docker 引擎的架構示意圖:

Docker 基礎

containerd

:它的主要任務是容器的生命周期管理——start | stop | pause | rm,但是它并不負責建立容器,而是指揮 runc 去做。

containerd-shim

是一個真實運作容器的載體,每啟動一個容器都會起一個新的containerd-shim的一個程序,其主要作用是:

  • 它允許容器運作時(即 runC)在啟動容器之後退出,簡單說就是不必為每個容器一直運作一個容器運作時(runC)
  • 即使在 containerd 和 dockerd 都挂掉的情況下,容器的标準 IO 和其它的檔案描述符也都是可用的
  • 向 containerd 報告容器的退出狀态

runc

生來隻有一個作用——建立容器。runc 與作業系統核心接口進行通信,基于所有必要的工具(Namespace、CGroup等)來建立容器。容器程序作為 runc 的子程序啟動,啟動完畢後,runc 将會退出。

Docker 架構

Docker 使用

用戶端-伺服器 (C/S) 架構模式

。Docker 容器通過 Docker 鏡像來建立。

容器與鏡像

的關系類似于面向對象程式設計中的

對象與類

Docker 基礎

一個完整的Docker有以下幾個部分組成:

  • DockerClient用戶端
  • Docker Daemon守護程序
  • Docker Image鏡像
  • DockerContainer容器

容器技術簡介

傳統虛拟機,如 VMware , VisualBox 之類的需要

模拟整台機器包括硬體

,每台虛拟機都

需要有自己的作業系統

。每一台虛拟機

包括應用

必要的二進制和庫

,以及一個

完整的使用者作業系統

容器技術是

與主控端共享硬體資源及作業系統

,可以實作資源的動态配置設定。容器

包含應用和其所有的依賴包

,但是

與其他容器共享核心

容器技術是實作作業系統虛拟化的一種途徑,可以讓您

在資源受到隔離的程序中運作應用程式及其依賴關系

Docker 基礎

Docker Client(用戶端)

它其實就是 Docker 提供指令行界面 (CLI) 工具,是許多 Docker 使用者與 Docker 進行互動的主要方式。用戶端可以建構,運作和停止應用程式,還可以遠端與Docker_Host進行互動。最常用的 Docker 用戶端就是

docker 指令

,我們可以通過 docker 指令很友善地

在 host 上建構和運作 docker 容器

Docker daemon(服務端)(背景運作程式)

Docker daemon 是伺服器元件,以 Linux 背景服務的方式運作,是 Docker 最核心的背景程序,我們也把它稱為守護程序

。Docker Daemon 運作在 Docker host 上,負責

建立、運作、監控容器

建構、存儲鏡像

從Docker 1.11之後,Docker Daemon被分成了多個子產品以适應OCI标準。

Image(鏡像)

Docker 鏡像可以看作是一個特殊的檔案系統,除了提供容器運作時所需的

程式、庫、資源、配置

等檔案外,還包含了一些為運作時準備的一些

配置參數(如匿名卷、環境變量、使用者等)

。鏡像

不包含任何動态資料

,其内容在建構之後也不會被改變。

鏡像中不包含核心——容器都是共享所在 Docker 主機的核心。是以有時會說容器僅包含必要的作業系統(通常隻有作業系統檔案和檔案系統對象)。

Docker 通過存儲引擎(新版本采用快照機制)的方式來實作鏡像層堆棧,并保證多鏡像層對外展示為統一的檔案系統。上層鏡像層中的檔案覆寫了底層鏡像層中的檔案。這樣就使得檔案的更新版本作為一個新鏡像層添加到鏡像當中。

由于 Docker 鏡像是多層存儲結構,并且可以繼承、複用,是以不同鏡像可能會因為使用相同的基礎鏡像,進而擁有共同的層。由于 Docker 使用 Union FS,相同的層隻需要儲存一份即可,是以實際鏡像硬碟占用空間很可能要比這個清單鏡像大小的總和要小的多。

Docker 基礎
Docker 基礎

Container (容器)

Docker 容器就是 Docker 鏡像的運作執行個體,是真正運作項目程式、消耗系統資源、提供服務的地方。

啟動容器之時,讓容器運作 Bash Shell(/bin/bash)。這使得 Bash Shell 成為容器中運作的且唯一運作的程序。

如果通過輸入 exit 退出 Bash Shell,那麼容器也會退出(終止)。

原因是容器如果不運作任何程序則無法存在,殺死 Bash Shell 即殺死了容器唯一運作的程序,導緻這個容器也被殺死。

按下

Ctrl+P+Q

組合鍵則會退出容器但并不終止容器運作。這樣做會切回到 Docker 主機的 Shell,并保持容器在背景運作。

除非你使用了資料卷(Volume)或資料容器,否則容器内運作期間産生的資料在容器關閉後,又回到你啟動容器時的原始鏡像狀态.
           

Repository (倉庫)

容器化

  • 編寫應用代碼。
  • 建立一個

    Dockerfile

    ,其中包括目前應用的描述、依賴以及該如何運作這個應用。
  • 對該 Dockerfile 執行

    docker image build

    指令。
  • 等待 Docker 将應用程式建構到 Docker 鏡像中。

Dockerfile

  • 對目前應用的描述。
  • 指導 Docker 完成應用的容器化(建立一個包含目前應用的鏡像)。
  1. 每個 Dockerfile 檔案第一行都是 FROM 指令

    FROM

    指令指定的鏡像,會作為目前鏡像的一個

    基礎鏡像層

    ,目前應用的剩餘内容會作為新增鏡像層添加到基礎鏡像層之上。
  2. RUN

    後面跟的是一些shell指令,通過&&将這些腳本連接配接在了一行執行,這麼做的原因是為了減少鏡像的層數
  3. COPY

    指令将應用相關檔案從建構上下文複制到了目前鏡像中,并且建立一個鏡像層來存儲。
  4. Dockerfile

    通過

    WORKDIR

    指令,為 Dockerfile 中尚未執行的指令設定工作目錄。

    該目錄與鏡像相關,并且會作為中繼資料記錄到鏡像配置中,但

    不會建立新的鏡像層

  5. EXPOSE

    指令用于記錄應用所使用的網絡端口。
  6. ENTRYPOINT

    指令來指定目前鏡像的入口程式。ENTRYPOINT 指定的配置資訊也是通過鏡像中繼資料的形式儲存下來,而

    不會新增鏡像層

IT

繼續閱讀