[Docker] Getting Start
過去當要架設應用程式時,在還不清楚應用程式的效能需求時,就需要先去買一台主機,但這常常需要用推估的,而且可能會浪費了在一台主機的資源和經費。
到了虛擬機器(Virtual machines, VM),它讓我們可以在單一的伺服器上運作多個不同的 App,但它還是有缺點,每一個 VM 都需要完整的 OS 才能執行,而每一個 OS 都需要 CPU, RAM 等才能運作,這些都需要補丁和授權,最終亦導致成本的增加。
為了解決 VM 到不足 Google 開始使用 container model。它可以在相同的主機上運行多的 container,如此釋放更多的 CPU 和 RAM 讓其他需要的地方使用。
對於開發者來說,透過 Docker 可以確保每一個開發者和每一個伺服器(包含,上線、開發和測試)時的開發環境相同。任何人都可以在短時間內設置好專 案,不需要再去花許多時間搞設定,安裝套件等等。
簡單來說,docker 是一個平台(platform),透過它的 container 可以讓你開發、部署和啟動應用程式。它可以讓你:
-
更快的上線,減少浪費許多時間在環境設定上,並且可以在本機直接啟動線上版的程式。
-
減少不同環境問題所導致的差異,將所有和應用程式有關的套件、設定和相依的套件都放在獨立的 container 內。
為什麼要使用 Docker
需要使用 Docker 的原因有很多:
- 解決相容性問題(「來自地獄的矩陣」): 在開發涉及多種技術的應用程式時,確保所有服務與作業系統、函式庫和彼此之間的相容性可能會很困難。Docker 通過將每個元件隔離在其自己的容器中來解決這個問題,每個容器都有自己的函式庫和依賴項。
- 簡化環境設定: 對於新的開發人員來說,設定開發環境可能很耗時且容易出錯。Docker 允許開發人員使用單個
docker run
命令來啟動應用程式堆疊,而無需擔心底層作業系統或依賴項。 - 確保不同環境中的一致性: Docker 容器保證在不同的環境(例如開發、測試和生產)中以相同的方式運行,因為它們包含運行應用程式所需的一切。這消除了“在我的機器上可以工作”的問題。
- 促進應用程式部署和擴展: Docker 使應用程式部署變得更容易,因為 Ops 團隊可以使用開發人員建立的映像來部署應用程式,而無需擔心基礎結構設定。此外,通過簡單地啟動更多容器並使用負載平衡器,可以輕鬆擴展基於 Docker 的應用程式。
Docker 容器與虛擬機器的差異
雖然 Docker 容器和虛擬機器都可以用來隔離應用程式及其依賴項,但它們在架構和功能方面存在顯著差異。以下是一些主要差異:
- 底層架構:
- 虛擬機器: 在底層硬體上運行一個管理程序 (Hypervisor),管理程序之上運行多個虛擬機器,每個虛擬機器都有自己的作業系統核心和完整的作業系統。
- Docker 容器: 在主機作業系統上運行 Docker 引擎,Docker 引擎管理多個容器,這些容器共享主機作業系統的核心。
- 資源利用率:
- 虛擬機器: 由於每個虛擬機器都運行一個完整的作業系統,因此虛擬機器的資源消耗率較高,需要更多記憶體和儲存空間。
- Docker 容器: Docker 容器更輕量級,因為它們共享主機作業系統的核心,只需要為應用程式和其依賴項分配資源,因此資源消耗率較低。
- 啟動時間:
- 虛擬機器: 虛擬機器的啟動時間較長,因為需要啟動整個作業系統。
- Docker 容器: Docker 容器的啟動時間較短,通常只需要幾秒鐘,因為它們不需要啟動整個作業系統。
- 隔離性:
- 虛擬機器: 虛擬機器提供更強的隔離性,因為每個虛擬機器都運行在獨立的作業系統上。
- Docker 容器: Docker 容器的隔離性較弱,因為容器共享主機作業系統的核心。
- 作業系統支援:
- 虛擬機器: 在同一個管理程序上可以運行不同類型的作業系統,例如 Linux 和 Windows。
- Docker 容器: 在單個 Docker 主機上只能運行與主機作業系統核心相同的容器。例如,在 Linux Docker 主機上不能運行 Windows 容器。
總結:
虛擬機器提供更高的隔離性和作業系統靈活性,但資源利用率較高且啟動時間較長。Docker 容器更輕量級,啟動速度更快,資源利用率更低,但隔離性較弱且作業系統支援有限。選擇哪種技術取決於應用程式的特定需求。
Container 和 Image 的差別
- Docker Image:它是一個可執行的檔案,包含了精簡版的作業系統(cutdown OS)、函式庫、設定檔等要運行一個應用程式所需的所有東西。透過 docker file 可以建立 docker image。
- Docker Container:是一個透過 docker image 運行起來的實例(instance),同一個 docker image 可以運行多個 container。
- image registries:github 之於原始碼,就類似 registry 之於 container images。