虛擬機還是 Docker?

如何理解您需要 Docker 而不是 VM? 您需要確定您到底想要隔離什麼。 如果你想隔離一個有保證資源和虛擬硬件的系統,那麼選擇應該落在虛擬機上。 如果您需要將正在運行的應用程序隔離為單獨的系統進程,則需要 Docker。

那麼Docker容器和VM有什麼區別呢?

虛擬機(VM) 是一台擁有所有虛擬設備和虛擬硬盤的虛擬計算機,上面安裝了新的獨立操作系統以及虛擬設備驅動程序、內存管理和其他組件。 也就是說,我們獲得了物理硬件的抽象,允許您在一台計算機上運行許多虛擬計算機。
安裝的虛擬機可能會以不同的方式佔用磁盤空間:

  • 固定硬盤空間,可以更快地訪問虛擬硬盤並避免文件碎片;
  • 動態內存分配。 安裝其他應用程序時,將為它們動態分配內存,直到達到分配給它的最大數量。

服務器上的虛擬機越多,佔用的空間就越大,並且還需要應用程序運行所需的環境的持續支持。

碼頭工人 是一款用於構建基於容器的應用程序的軟件。 容器和虛擬機具有類似的優點,但工作方式不同。 容器佔用的空間更少,因為與虛擬機相比,過度使用主機系統的共享資源,因為與 VM 不同,它提供操作系統級別的虛擬化,而不是硬件級別的虛擬化。 此方法提供更少的內存佔用、更快的部署和更輕鬆的擴展。

容器通過向主機系統提供必要的接口,提供了一種更有效的封裝應用程序的機制。 此功能允許容器共享系統的核心,其中每個容器作為主操作系統的單獨進程運行,主操作系統擁有自己的一組內存區域(自己的虛擬地址空間)。 由於每個容器的虛擬地址空間都是自己的,因此屬於不同內存區域的數據無法更改。
Docker 的原生操作系統是 Linux(Docker 也可以在 Windows 和 MacOS 上使用),它利用了它的主要優點,這使得它能夠組織分割內核。 Windows 上 Docker 容器的啟動將在 Linux 虛擬機內進行,因為容器共享主機系統的操作系統,其主要操作系統是Linux。

容器——它是如何工作的?

容器 是應用程序級別的抽象,結合了代碼和依賴項。 容器總是從鏡像創建,添加可寫的頂層並初始化各種參數。 由於容器有自己的寫入層,並且所有更改都存儲在該層中,因此多個容器可以共享對同一主映像的訪問。

每個容器都可以通過主解決方案 docker-compose.yml 中包含的 docker-compose 項目中的文件進行配置。 在那裡您可以設置各種參數,例如容器名稱、端口、標識符、資源限制、其他容器之間的依賴關係。 如果您沒有在設置中指定容器名稱,那麼 Docker 每次都會創建一個新容器,並隨機為其分配一個名稱。

當容器從映像啟動時,Docker 會將讀/寫文件系統安裝在下面任何層的頂部。 這是我們希望 Docker 容器運行的所有進程都將運行的地方。

當Docker第一次啟動一個容器時,初始的讀/寫層是空的。 當發生變化時,它們會被應用到該層; 例如,如果要修改一個文件,該文件將從下面的只讀層複製到讀寫層。
該文件的只讀版本仍然存在,但現在隱藏在副本下。 卷用於存儲數據,與容器的生命週期無關。 創建容器時會初始化卷。

鏡像與容器是如何關聯的?

圖片 - 每個容器的主要元素。 鏡像是根據添加到項目中的 Dockerfile 創建的,是一組相互層疊並分組在一起的文件系統(層),僅供讀取; 最大層數為127。

每個鏡像的核心是一個基礎鏡像,它由 FROM 命令指定 - 生成 Dockerfile 鏡像時的入口點。 每層都是只讀層,由一個修改文件系統的命令表示,寫入 Dockerfile。
為了將這些層組合成單個映像,Docker 使用高級多層聯合文件系統(AuFS 構建在 UnionFS 之上),允許來自不同文件層的不同文件和目錄透明地重疊,創建關聯的文件系統。

層包含元數據,允許您在運行時和構建時存儲有關每個層的相關信息。 每層都包含到下一層的鏈接,如果該層沒有鏈接,則這是圖像中的最頂層。

Dockerfile 可能包含以下命令:

  • FROM - 圖像形成的入口點;
  • MAINTAINER - 圖像所有者的姓名;
  • RUN——鏡像組裝過程中的命令執行;
  • ADD - 將主機文件複製到新鏡像中,如果指定URL文件,Docker會將其下載到指定目錄;
  • ENV——環境變量;
  • CMD——開始基於鏡像創建新容器;
  • ENTRYPOINT - 該命令在容器啟動時執行。
  • WORKDIR是執行CMD命令的工作目錄。
  • USER - 設置從映像創建的容器的 UID。
  • VOLUME - 將主機目錄安裝到容器。
  • EXPOSE 是容器中監聽的一組端口。

UnionFS 是如何工作的?

聯盟FS — 適用於 Linux 和 FreeBSD 的服務堆棧文件系統 (FS)。 該FS實現了寫時復制(Copy-On-Write,COW)機制。 UnionFS的工作單元是一層,每一層都應被視為一個獨立的成熟文件系統,具有從根本身開始的目錄層次結構。 UnionFS 為其他文件系統創建聯合掛載,並允許您透明地將來自不同文件系統(稱為分支)的文件和目錄合併到單個鏈接文件系統中,這對用戶透明。

具有相同路徑的目錄的內容將一起顯示在生成的文件系統的一個組合目錄(同一命名空間中)中。

UnionFS 根據以下原則組合層:

  • 其中一層成為頂級層,第二層及後續層成為較低層;
  • 用戶可以“從上到下”訪問圖層對象,即如果請求的對象位於“上”層,則返回該對象,無論“下”層中是否存在同名對象; 否則,返回“底層”對象; 如果請求的對象既不存在也不存在,則返回錯誤“No such file or directory”;
  • 工作層是“頂層”,即所有用戶更改數據的操作都只反映在頂層,而不影響下層的內容。

Docker 是在應用程序工作中使用容器的最常見技術。 它建立在 Linux 內核提供的 cgroup 和命名空間之上,已成為該領域的標準。

Docker 允許我們快速部署應用程序,並通過在所有容器之間共享操作系統內核(作為單獨的操作系統進程運行)來充分利用文件系統。

來源: www.habr.com

添加評論