本篇文章介紹 Docker 的概念,參考官方文件

Docker 概念簡介

Docker 是一個用於開發、部屬和執行程式的平台。他能讓「應用程式」和「基礎設施」
(指運行應用程式的必須物件,例如: pip install -r requestments.txt 需要 requestments.txt) 分離。
可以透過 Docker 達到「快速交付」、「測式」、「部屬」等需求,減少寫完程式後到部屬環境之間的延遲。
Docker 是作業系統的虛擬化,虛擬機則是硬體的虛擬化,因此 Docker 基於 Host OS 建立自己的 Guest OS,使用同一個作業系統,所以速度相對於虛擬機更快。

Docker 平台

Docker 提供一個具有打包能力,並且在鬆散的環境之下可運行應用程式的物件,稱為 Container。
Container 無須依賴任何主機上的安裝內容,在具有隔離的環境中獨自執行。
只要能確保每個人使用相同 Container,都會有相同的工作方式。

Docker 可以幫助什麼

快速且一致性的交付應用程式

Docker 提供一個標準的開發環境,藉此簡化開發流程,非常適合用在 CI/CD 流程,因為他需要一致性的環境。

高自由度的部屬和擴展

Docker 具有高自由度的移植性,可以在個人電腦、伺服器、虛擬機、雲端服務或更複雜的環境下運行。
Docker 的輕量化設計,讓管理者有高自由度的拆除或新增應用程式,意思是把大應用程式,切分成多個獨立小應用程式,更容易擴展或拆除。

在相同硬體下運行更多工作

相比於虛擬機的運行消耗,Docker 更有效率應用效能,非常適合高密度的中小型部屬

Docker 架構

Docker 使用 client-server 架構。Docker client 和 Docker daemon 進行溝通,溝通內容包含建置、運行和發布 container。
Docker client 和 daemon 可以運行在相同系統;也可以讓 client 連線到遠端的 daemon。
兩者之間使用 REST API 進行溝通,溝通方式是基於 UNIX sockets 或 network interface。
另外一種 Docker client 是 Docker Compose,他使用一群 containers 組成應用程式。

1

The Docker daemon

Docker daemon (dockerd) 作為平台的伺服器端,等待 Docker API 的請求,並管理 Docker objects
Docker daemon 可以和其他 docker daemon 溝通並管理 Docker 服務

The Docker client

Docker client (docker) 是 Docker 使用者主要的互動方式。例如: docker run 或是傳送命令給 dockerd 都會用到。
Docker 命令使用 Docker API,且一個 Docker client 也可以和多個 daemon 溝通

Docker Desktop

Docker Desktop 是一個簡單安裝應用程式的方法,可以安裝於 Mac, Windows 或 Linux。他可以用於建構或分享已經容器化的應用程式
Docker Desktop 包含 Docker daemon、Docker client、Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper

Docker registries

Docker registries 儲存多個 Docker images。Docker Hub 就是一個公開的 Docker registries。
Docker 預設在 Docker Hub 尋找 Docker images。也可以運行自己私有的 registry

Docker objects

Docker objects 包含像是 images、containers、networks、volumes、plugins 和其他 objects 等.

Images

Images 是只可讀取、不可修改的樣板,它裡面也包含基礎設施,主要用於建立 Docker container。
通常 Images 都是基於其他 Images 的客製化,例如: 建立基於 ubuntu 的 Image,並安裝 Apache Web server,並設定細節使應用程式正確運行

你可以用簡單語法建立,並定義 Dockerfile。透過 Dockerfile 建立 image 和執行。
Dockerfile 中的每條指令都會在 image 中建立一個 layer。當更改 Dockerfile 並重建 image 時,僅重建被更改的 layer。
相比於其他虛擬化,這是使 image 輕量和快速的原因之一

Containers

Container 是一個可運行的實體 image。可以透過 Docker API 或 Docker CLI 執行 create、start、stop、move 或 delete 命令
您可以將 container 連接到一個或多個網絡,甚至可以根據其當前狀態創建新 image。

通常的情況下, container 之間,或是 container 與主機之間,建議是互相隔離。你可以控制如何隔離 container 之間的網路、儲存空間。
Container 由 image 和建立或啟動參數組成。當 Container 被移除時,未存儲在永久存儲區域的的狀態都會消失。

Docker run command 範例

底下的命令代表執行 ubuntu container,保持互動模式,並且執行 /bin/bash
-i , –interactive : 讓 Container 的標準輸入保持打開
-t , –tty : 讓 Docker 分配一個 pseudo-tt 並綁定到 Container 的標準輸入上

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

當你執行此命令會發生以下事件:

  1. 當你沒有 ubuntu image,他會從登記處提取,就如同手動提取一樣
  2. Docker 建立一個新的 Contrainer 就如同 docker container create
  3. Docker 為 container 分配一個讀寫文件系統,作為它的最後一層。 這允許正在運行的 container 在其本地文件系統中創建或修改文件和目錄。
  4. Docker 建立一個網絡接口並將 Container 連接到預設網絡
  • 沒有指定任何網絡選項,預設使用主機的網絡連接到外部網絡。
  • 為容器分配 IP 地址
  1. Docker 啟動 Container 並執行 /bin/bash,可以將輸出顯示於 terminal,並用鍵盤輸入 (-i, -t)
  2. 當輸入 exit 離開時,Container 停止,但並沒有被刪除,仍可以再次執行或是刪除

底層技術

Docker 是使用 Go 語言編寫,並利用 Linux kernel 的特性提供功能。
Docker 使用一種稱為命名空間的技術,提供隔離的工作環境 (容器),當執行 Container 時,Docker 會建立一組命名空間給他用
這些命名空間提供一層隔離。容器的每個方面都在單獨的命名空間中運行,並且限定訪問權限於該命名空間