虛擬化容器技術與Docker

虛擬機(virtual machine)

虛擬機就是帶環境安裝的一種解決方案。它可以在一種操作系統裏面運行另一種操作系統,比如在 Windows 系統裏面運行 Linux 系統。應用程序對此毫無感知,因爲虛擬機看上去跟真實系統一模一樣,而對於底層系統來說,虛擬機就是一個普通文件,不需要了就刪掉,對其他部分毫無影響。

虛擬機缺點:資源佔用多;冗餘步驟多;啓動慢


Linux容器

針對虛擬機容器的缺點,另一種虛擬化技術:Linux容器(Linux Containers,縮寫爲 LXC),依賴於Linux內核特性:NameSpace(命名空間) 和 Cgroups(控制組),只能運行Linux系統,而不能運行Windows系統,它包含了基本的文件系統、進程、網絡設備。


NameSpace 和 Control Groups

理解NameSpace和Control Groups有助於理解Docker的資源分配和管理

NameSpace
PID:(Process ID),進程隔離
NET:(NetWork),管理網絡接口
IPC:(InterProcess Communication),管理跨進程通信的訪問
MNT:(Mount),管理掛載點,文件系統的隔離
UTS:(Unix Timesharing System),隔離內核和版本標識

這些隔離的資源怎麼管理起來?使用Cgroups

Control Groups
是Linux內核提供的可以記錄、限制、隔離進程族所使用的物理資源的機制,來源於Google,用來分配資源,沒有Cgroups就沒有容器技術
—提供的功能:
資源限制,例如:限制進程族的內存上限。
優先級設定,例如:設定哪些進程族使用更大的CPU或磁盤IO
資源計量,例如計算進程族使用了多少資源
資源控制,例如:將進程族掛起或恢復

Docker 容器的能力
文件系統隔離:每個容器都有自己的root文件系統
進程隔離:每個容器都運行在自己的進程環境中
網絡隔離:容器間的虛擬網絡接口和IP地址都是分開的
資源的隔離和分組:使用Cgroups將CPU和內存之間的資源獨立分配給每個Docker容器


Linux 容器不是模擬一個完整的操作系統,而是對進程進行隔離。
或者說,在正常進程的外面套了一個保護層。對於容器裏面的進程來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。

由於容器是進程級別的,相比虛擬機有很多優勢:啓動快;資源佔用少;體積小


Docker

Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口,將應用程序自動部署到容器的開源引擎,使用Go語言開發。
Docker 將應用程序與該程序的依賴,打包在一個文件裏面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器裏運行,就好像在真實的物理機上運行一樣。有了 Docker,就不用擔心環境問題。總體來說,Docker 的接口相當簡單,用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的代碼一樣。

Docker用途
(1)提供一次性的環境。比如,本地測試他人的軟件、持續集成的時候提供單元測試和構建的環境。
(2)提供彈性的雲服務。因爲 Docker 容器可以隨開隨關,很適合動態擴容和縮容。
(3)組建微服務架構。通過多個容器,一臺機器可以跑多個服務,因此在本機就可以模擬出微服務架構。

Docker的基本組成

  1. Docker Client 客戶端
  2. Docker Daemon 守護進程

Docker 是 C/S 架構,Docker Client 向 Docker Daemon 服務端發出請求,服務端守護進程處理完所有的工作並返回結果。

在這裏插入圖片描述

  1. Docker Image 鏡像
    Image 鏡像是容器的基石,就像容器的源代碼一樣,它是一個層疊的只讀文件系統。
    最底端是一個引導文件系統——bootfs,當一個容器啓動後,容器將會移動到內存中,而引導文件系統將被卸載。
    第二層是 root 文件系統——rootfs,rootfs是一種操作系統,例如 Ubuntu/CentOS ,rootfs 永遠是隻讀狀態,Docker使用聯合加載技術(union mount,一次同時加載多個文件系統) 在 rootfs 之上加載更多的只讀文件系統,聯合加載會將多個文件系統疊加在一起,這樣最終的文件系統會包含所有的底層文件和目錄。Docker 將這樣的文件系統稱爲鏡像,一個鏡像可以位於另一個鏡像的頂部,下面的鏡像稱爲父鏡像。
    在這裏插入圖片描述

  2. Docker Container 容器
    容器通過鏡像來啓動,Docker 容器是 Docker 的執行單元,容器中可以運行客戶的一個或多個進程。如果說鏡像是Docker 生命週期中的構建和打包階段,那麼容器就是啓動和執行階段。
    容器怎麼通過鏡像來啓動?當 Docker 啓動一個容器時會在該鏡像的最頂層加載一個讀寫文件系統,也就是一個可寫的文件層。當 Docker 第一次啓動這個容器時,初始的讀寫層是空的,當文件系統發生變化時,這些變化都會應用到這一層上,例如:要修改一個文件,這個文件首先會從該讀寫層下面的只讀層複製到該讀寫層,改文件的只讀版本依然存在,但是已經被該讀寫層中的文件副本所隱藏,這就是 Docker 中的一個重要技術:寫時複製(copy on write)。
    在這裏插入圖片描述

  3. Docker Registry 倉庫
    倉庫來保存用戶構建的鏡像。分爲 公有私有 兩種。Docker 公司提供了一個公有的倉庫—— Docker Hub,可以在 Docker Hub 上註冊賬號,分享並保存自己構建的鏡像,可以查找需要的鏡像。可以搭建自己私有的倉庫。
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章