Docker 基本概念教學

本篇僅介紹基本的 docker 概念與架構,不會涉及到實作與指令等。


應用場景

  • Scenario1

機器數量很多正在安裝,數天到數周後才能交付

  • Scenario2

工程師:「這在我的電腦是好的」
QA、User、PM:「在我電腦看就是壞的啊!」

  • Scenario3

專案用開發/測試環境很複雜,與其幫你安裝,不如我建立好 VM,拷貝給你後使用
VM 開太多了,電腦不太能動

  • Scenario4

我們無法使用雲端服務,因為環境設定太多
佈署太慢、太多手動項目
做不到 zero-downtime

  • Scenario5

在 Production 環境上的 libirary 檔案似乎沒佈署到,或者根本被偷換!?

以上各種痛點都是容器化技術高度發展之前常發生的事情。當我們要使用特定應用程式時,不可少的就是安裝需要軟體、設定環境等,遇到複雜的系統就要更多的程式安裝,再加上機器(電腦、伺服器)數量一多,那麼花費的時間與人力成本更是大幅提升。

容器化技術能夠讓大家使用相同版本、相同環境,且保證其環境乾淨,要啟動程式的時間與資源更是比 VM 低上好幾倍。後期發展的 DevOps、雲端佈署(PasS)以及微服務(Microservices)更是透過容器化技術減少人為介入程度,達到更高度自動化與安全性。

Docker 是什麼?

Docker 整體架構包含了很多項目,這邊會一一拿出來解釋。

Container & VM

容器,如同 Docker 上常用的貨櫃,透過容器化技術一一將貨櫃堆疊起來,每個貨櫃都有各自的功能,組建成一個完整的系統服務。

每個容器是獨立的,擁有自己的 Hostname, IP, Volume 以及相關的應用程式。

alt

從上圖可以得知,每個容器可視為一個獨立的個體、彼此不會相互影響,透過 Docker Engine 作相對應的管理,像是網路、磁碟空間。

而之前的 VM 技術如下圖,最大差異在每個獨立執行環境都多了 Guest OS 來支撐,因此對於硬體資源的消耗相較於 docker 是多了好幾倍,這樣可以理解為什麼 VM 執行總是又慢又笨重,而 docker 僅需僅僅數秒鐘的事。

alt

Docker Engine

Docker Engine 是整個 Docker 功能的主要核心,就是因為它才能夠讓 docker 實現跨平台運作。

這個程式是一個 client-server 架構

  • 伺服器端:背景服務程式(docker daemon),並具備了 Restful API 功能。
  • 客戶端:使用 Command Line Interface (CLI) 下達指令,透過上述 restful API 送至伺服器端進行溝通。

alt

圖片出處

在這張圖中還包含了幾項功能:

  • image: 映像檔,由 docker engine 所管理。它是一個模板(template),透過映像檔建立出容器,這些容器都是一模一樣的內容,僅有其 ID 不同。映像檔的內容可以是你的程式、一個 mongodb 資料庫甚至是一個 OS。

    要製作映像檔需要撰寫dockerfile,這個就放在後面再提。
    映像檔內容可以是層層堆疊起來的,例如我的程式是基於 node.js 來執行,但不需要從 node.js 編譯環境開始打包,而是直接取得網路上認證的 node.js 打包後的映像檔,再堆疊我的程式即可。

  • network: 前面提到過,每個容器都是獨立運作不受影響的,但仍然需要進行對外連線,或者內部連線,因此由 docker engine 控制管理,其連線方式分別有多種,在概述這邊不會細談,僅需要知道仍然具備連線功能即可。

  • volume: 容器在執行時所產生的資料都是存在容器內,會隨著容器關閉而消失,因此想保留資料的話,需額外提供空間讓容器儲存。

Docker Registry

當我們產生映像檔後,要如何提供給別人使用呢?推送上儲存倉庫(registry)!我們最常使用的莫過於 Docker Hub了,上面有官方認可的標章,確保沒有參雜其他惡意程式。

除了公有,也能夠自行建立私有的 docker registry。

該串起完整流程了

懂了這些東西之後,我們就能夠理解 docker 的整體架構了。

alt

圖片出處

  1. 客戶端執行 docker pull,從倉庫(registry)取得映像檔(images)
  2. 客戶端執行 docker run,從映像檔建立出一至多個容器(container)

就是這麼簡單~

而建立映像檔流程也是

  1. docker build,產生映像檔
  2. 將映像檔推送至倉庫,供其他人使用

看到這邊你已經了解 docker 的架構全貌了,運行方式就是如此簡單,本篇的目的僅是要介紹整個架構,之後再詳細描述各個項目的使用方式。

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。