【Day 1】Docker 基本概念


前言

雖說網上滿天遍野 Docker 介紹,私心覺得這部份很重工、好想直接跳過,但名為系列文,感覺還是要逼著自己有個始啊。

Docker 簡介

Docker 是個管理容器(container)的服務,提供「應用層級」的虛擬化技術(不同於OS層級虛擬化的虛擬機)。藉由 Linux 內核的 cgroup、namespace,以及 UnionFS 等技術,來達到應用程式的資源限制與封裝隔離。

換句話說,容器不像虛擬機要在 Host OS 上再安裝 Guest OS,而可以直接共用底層 Host OS 的資源,同時具備其應用程式沙盒的隔離性(不受 Host OS 與其他容器的影響)。而 Docker 就是幫我們達到這項技術的服務,於是我們得以遠離直接操作底層的辛苦活兒(但菜鳥我也不會這麼做喇)。附上介紹文必備的 虛擬機 vs Docker 圖:

VM & Docker 架構圖

為何要 Docker

相較於虛擬機,Docker的優勢:

  1. 不須啟動/執行完整 OS
    • 系統資源利用更高效:少了執行 OS 的資源開銷(內存需求減少,執行與存儲速度提升),故相同的主機,可以執行更多應用程式(一個主機能跑上千個容器,但只能跑數十個虛擬機)
    • 啟動更快速:不需啟動完整 OS,Docker 只需數秒,甚至毫秒就能啟動,而虛擬機需要數分鐘
  2. Docker Image 提供應用所需的完整執行條件(除了內核資源以外)
    • 確保執行環境一致
      • 避免開發、測試、生產環境不一致,導致「在我機器上正常啊」之類的問題
    • 應用搬遷、維護、擴展更容易
      • 搬遷:承上,構建一次 image,可正常執行於任意平台
      • 維護、擴展:外加 image 的分層儲存技術,使 image 可以基於其他 image,應用程式間相同的部分得以複用
  3. Dockerfile 紀錄 image 構建的完整資訊
    • 環境部屬透明化:無論 Dev 或 Ops 人員都更容易理解應用所需的執行環境條件

Docker 基本概念

書中列了 Docker 的三大概念: Image (鏡像)、 Container (容器)、 Repository (倉庫),我這兒順道補充 Registry (倉庫伺服器?),因書中把 Repository 和 Registry 都譯為倉庫,個人感覺容易混淆。

Image(鏡像/映像檔)

Image 包含了容器執行所需的檔案(應用程式、依賴庫、資源與相關配置),還有一些執行時的配置參數(如匿名卷、環境變量、用戶等)。

雖譯為映像檔,但不是 .iso 那樣完整的一大包打包。Docker 為了縮小 image 體積、達到更好的維護、擴展性,採用「分層存儲」架構,一個 image 其實是多層 images 聯合組成

通常構建 image 時,會基於一個 base image,透過一個個指令添加該容器所需的其他東西。這過程的每個指令,並不會修改 base image,而是創建新的 image 疊在先前的 image 上,最後得到我們要的最終image。

Image 只是一個抽象概念

一個 image 並非一個檔案或一個檔案系統,而是由多層檔案系統聯合組成。Docker 透過 UnionFS 技術實現此分層存儲架構。

只要記得,image 是靜態的(唯讀),構建後就不會再被改變。構建過程的每段指令結束時,就代表創建了一個新的 image,之後的任何指令都只會在之後的 image 起作用。所以指令結束前,要把所有之後不需要的東西清除,否則之後再下指令刪除的話,只會在當前 image 裡隱藏起來。因為那是在先前 image 創建的、存在於先前的 image,當前指令所創建的 image 刪不到它。結果會使 最終image 越來越笨重。

Container(容器)

Image 是靜態的定義,Container 是 Image 運行時的實體

容器運行時,會基於 Image,在上頭添加一個當前容器的「容器儲存層」,以儲存執行過程的任何讀寫。當容器被移除(container rm)此儲存層也會一同被移除

如果資料不能被移除,可使用 Volume(數據卷,如同容器與宿主環境的共用資料夾)或直接綁定宿主檔案系統目錄/文件。

Container 的實質是程序(process)

只是 Container 這個 process 執行於獨立於宿主的環境,其執行環境即 Image 所提供的,擁有自己的檔案系統、網路配置、用戶ID等等等,以及剛剛提到的執行所需的儲存空間。

Repository(倉庫)

Repository(倉庫)即一堆同名 images 的集合,一個 repository 可以有多個 images,而這些同名 images 透過 tag 分辨彼此

舉例來說,ubuntu:latest 和 ubuntu:19.10 這兩個 images,都屬「ubuntu」這個repository,而 latest 和 19.10 為它們的 tag。

而通常非 Docker 官方建立的 repositories 會含有用戶名,像是 usernameA/ubuntu:latest 和 usernameA/ubuntu:temp 這兩個images,就屬「usernameA/ubuntu」這個repository)

Registry(倉庫伺服器)

Registry 儲存/管理 repositories 的服務器,如 Docker官方的 DockerHub,Google的Google Container Registry,Amazon的AWS Container Registry等,供用戶 push/pull images。類似 GitHub 管理 repositories。

另外,也可以是建立於內網/本地的私有 registry(Docker 提供 docker-registry 工具,可支持本地建立 private registry)。

Registry、Repository、Image、Container 間的關係

只包含上述四項概念間的超簡化關係圖:

Registry,Repository,Image,Container

Docker 安裝

目前只裝過 Win10 + WSL,暫不在此贅述。

如有需要者,歡迎參考我不負責任的 Evernote 筆記——「Setup for Docker Desktop (Docker for Windows)」(很亂就是了 > <)。

結語

這篇簡單介紹各概念名詞,主要想先釐清名詞與它們之間的關係,並對 Docker image 相關生命週期有些概念。之後針對各名詞會再分享更深入的學習紀錄。

#docker #image #container #registry #repository





旨在督促閱讀,同時學習組織與分享,《­Docker——從入門到實踐》原文:https://github.com/yeasy/docker_practice/,繁中版:https://philipzheng.gitbooks.io/docker_practice/

留言討論