Container 概念筆記

施靜樺
8 min readJan 27, 2019

--

最近好常聽到 Container, Docker, Kubernetes, Microservice 這些名詞,該是時候來好好梳理清楚了。

先一句話簡介以上四個字的關係:

Docker 是一個讓 Container 標準化的專案 /工具,而 Kubernetes 是用來管理 Container 的系統。Microservice 是基於 Container 之上快速發展起來的概念。

很明顯的,要暸解以上這些東西,就要先暸解 Container。但要暸解 Container,還要先暸解一個概念叫做虛擬機器。

虛擬機器 Virtual Machine

在 Container 的概念尚未開始流行之前,一般而言一個應用程式的執行會是透過虛擬機器(以下簡稱 VM)來進行。為什麼不直接執行應用程式呢?因爲每台主機的環境配置、作業系統都不盡相同,所以當一台主機要直接執行用另外一台主機開發出來的應用程式,很可能會因為環境不一致的關係而失敗。VM 的概念是在將應用程式打包時,除了程式本身,還順便一起打包開發的作業系統,當任何一台主機(Host OS)要執行此應用程式時,就可以在 VM 中先下載裝有此應用程式所需一切資源的作業系統(此稱 Guest OS), 模擬出一個熟悉的空間給此應用程式,這樣就能確保應用程式的順利執行。

VM 的好處有

  1. 軟硬體分離:因為應用程式執行的環境是虛擬的,所以硬體不用被限制在特定廠牌或是規格。
  2. 安全性高:對作業系統而言,看起來就像是在一臺正常的實體機器中,在 VM 中做的動作不會影響到 Host OS,並且就算多個 VM 在同一臺實體伺服器中執行,彼此之間也都是獨立互不干擾的。

但 VM 同時也有一個顯而易見的缺點:冗。時間上來說,每次都要先在 VM 裡面裝好一套作業系統才能執行應用程式,建好作業系統也要等開機,所以 VM 的建立速度就不會很快(大約是幾十秒到幾分鐘)。空間上來說,一套作業系統大都上百 MB,就算應用程式本身只有幾 KB,還是必須要耗費一整個作業系統的資源。資源分配上來說,實體伺服器不只要分配資源給應用程式本身,也會需要將一部份運算資源分給作業系統的執行,是個必要之惡。

容器 Container

為了改善 VM 不能把錢(資源)花在刀口上的缺憾,Container 登場了。

Container 同樣是將應用程式連同其所需環境(相關程式碼、函式庫、環境配置檔)一同打包的技術,但是在 Container 中不需要安裝作業系統就能執行應用程式。既然 Container 不像 VM 那樣自己的作業系統自己做,那 Container 要在哪裡運行呢?答案是在 Host OS 的核心系統層。

所有 Container 共用 Host OS,並建立資源控管機制來分配 Host OS 上的系統資源,因此省去了執行 Guest OS 的時間與心力,而能夠同時做到每個 Container 互相獨立。就像在雨水中旋開的一把把雨傘, Container 在同一個空間中,卻又彼此有自己獨立的傘下空間。

所以說,VM 的中心是作業系統,而 Container 的中心是應用程式。

Container 的優勢基本上都跟甩掉了大個子 Guest OS 有關:

  1. 執行速度快:相比 VM 以分鐘為單位,Container 執行速度可以以秒為單位。
  2. 儲存空間小:相比 VM 以 GB 為單位,Container 執行速度以 MB 為單位。
  3. 資源更有效運用:免去了執行 Guest OS 的義務,同一台主機上可以裝載的 Container 數量可以是 VM 的好幾倍。

但 Container 也不是一個完美情人。比如說它沒有建立自己的作業系統,所以只能依賴 Host OS,並且縱然它解決了很多 VM 的限制,想要體驗 Container 的完整威力,就要先將應用程式變成等等會提到的 Microservice,不然 Container 就只會是一個讓你比較容易打包的工具而已。

Docker

Docker provides tooling and a platform to manage the lifecycle of your containers:

- Develop your application and its supporting components using containers.

- The container becomes the unit for distributing and testing your application.

- When you’re ready, deploy your application into your production environment, as a container or an orchestrated service. This works the same whether your production environment is a local data center, a cloud provider, or a hybrid of the two.

節錄自 Docker 官網

Docker 是目前最流行的一個容器化技術。它創造了一個標準化的 container 製造程序,讓應用程式具有相同的封裝方式、啟動方式、存取方式,不用修改就能在任何支援 Docker 的平臺上執行。

Docker 映像檔(Dockerfile)是讓 Docker 之所以強大的關鍵(之一)。Container 在打包的過程,所有這個 Container 需要的程式和設定資訊都會放在 Dockerfile 中,於是在所有支援 Docker 的環境中執行這個 Dockerfile,就能夠確保建立一模一樣的 Container。

Docker 一個很大的影響是波及了 PaaS (平台即服務)的生計,因為 IaaS 平臺只要支援 Docker,就可以執行 Container 中的應用程式,不再需要設定 Virtual Machine,因此很容易就可以達成 PaaS 的功能。

想要看有更深入一點的細節但又不要太深的導覽文章可以參考這篇文章

Kubernetes

有了 Container 改善傳統 Virtual Machine 的笨重、有了 Docker 來標準化 Container 的製造,再一個能夠讓你輕鬆管理 Container 的平台,聽起來挺完美的吧?Kubernetes 就是如此平台,所謂 Container Orchestration Platform。Kubernetes 介紹就到這。我是認真的。

微服務 Microservice

容器化的技術讓應用程式能夠被打包成更輕量簡便的包裹,於是「微服務」的概念就興起了。在此風潮之前,傳統的單體架構(Monolithic Architecture)是所有的資源、功能、操作等等放在一個應用程式中,彼此之間關係緊密,因此常常會有改一個小細節就必須波及許多部分的「牽一髮而動全身」的情況,所以可擴展性(Scalability)就不能很高。

於是微服務出現了。微服務是一種重新建構應用程式的方法,將一個應用程式中不同的功能切開,變成彼此獨立的運作個體。

幾個特色:

  1. 低耦合(loose coupling)與高內聚力(high cohesion): 服務與服務之間關聯低,不互相牽制,而相同功能應該要放在同一個服務之內。如此達成的效果是想要改變一項功能只需要去一個地方修改,並且不會影響到其他服務。
  2. 資料管理去中心化(decentralized data management):每個服務可以有自己的資料庫。
  3. 使用 API 溝通:利用像是 HTTP protocal 來聯絡每個服務。
  4. 服務可以獨立部署:小組可以直接更新現有服務,而不需要重建和重新部署整個應用程式。

這位架構師用了很詳細的篇幅來解釋微服務的概念還有實作的經驗,存參。

筆記先到這邊。雖然已盡能力所及地確保資料的正確性,但我恐怕還是會有不對/不精確的觀念或用字,如果願意指正我的話我會非常感激!

參考資料

--

--