跳至主要内容

[Docker] Getting Start

過去當要架設應用程式時,在還不清楚應用程式的效能需求時,就需要先去買一台主機,但這常常需要用推估的,而且可能會浪費了在一台主機的資源和經費。

到了虛擬機器(Virtual machines, VM),它讓我們可以在單一的伺服器上運作多個不同的 App,但它還是有缺點,每一個 VM 都需要完整的 OS 才能執行,而每一個 OS 都需要 CPU, RAM 等才能運作,這些都需要補丁和授權,最終亦導致成本的增加。

為了解決 VM 到不足 Google 開始使用 container model。它可以在相同的主機上運行多的 container,如此釋放更多的 CPU 和 RAM 讓其他需要的地方使用。

對於開發者來說,透過 Docker 可以確保每一個開發者和每一個伺服器(包含,上線、開發和測試)時的開發環境相同。任何人都可以在短時間內設置好專案,不需要再去花許多時間搞設定,安裝套件等等。

VM 和 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。

Imgur

常見問題

ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running

ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running? @ Github Issue

只需在執行 docker 指令前加上 sudo 即可解決。

參考