linux内核中用来对共享资源进行隔离,简单理解Docker
什么是Docker
Docker使用Go語言進行開發實現,基于Linux內核的cgroup,namespace,以及AUFS類的Union FS等技術,對進程進行封裝隔離,屬于操作系統層面的虛擬化技術。
由于隔離的進程獨立于宿主和其他的隔離的進程,因此也稱其為容器。
Docker 在容器的基礎上,進行了進一步的封裝,從文件系統、網絡互聯到進程隔離等等,極
大的簡化了容器的創建和維護。使得 Docker 技術比虛擬機技術更為輕便、快捷。
基本概念
鏡像 (Image)
容器 (Container)
倉庫 (Repository)
鏡像
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。
在 Docker 設計時,就充分利用 Union FS 的技術,將其設計為分層存儲的架構。
鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。因此,在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
容器
鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個為容器運行時讀寫而準備的存儲層為容器存儲層。
任何保存于容器存儲層的信息都會隨容器刪除而丟失。
容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。
使用數據卷后,容器刪除或者重新運行之后,數據卻不會丟失。
倉庫
倉庫是一個集中的存儲、分發鏡像的服務。
一個 Docker Registry 中可以包含多個倉庫( Repository );每個倉庫可以包含多個標簽( Tag );每個標簽對應一個鏡像。
鏡像的實現原理
每個鏡像都由很多層次構成,Docker 使用 Union FS 將這些不同的層結合到一個鏡像中去。
通常 Union FS 有兩個用途, 一方面可以實現不借助 LVM、RAID 將多個 disk 掛到同一個目錄下,另一個更常用的就是將一個只讀的分支和一個可寫的分支聯合在一起,Live CD 正是基于此方法可以允許在鏡像不變的基礎上允許用戶在其上進行一些寫操作。
Docker 在 AUFS 上構建的容器也是利用了類似的原理。
Docker數據管理
在容器中管理數據主要有兩種方式:
數據卷(Volumes)
掛載主機目錄 (Bind mounts)
數據卷
數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
數據卷 可以在容器之間共享和重用
對 數據卷 的修改會立馬生效
對 數據卷 的更新,不會影響鏡像
數據卷 默認會一直存在,即使容器被刪除
掛載主機目錄
掛載一個主機目錄作為數據卷
掛載一個本地主機文件作為數據卷
Docker底層實現
Docker 底層的核心技術包括 Linux 上的命名空間(Namespaces)、控制組(Control groups)、Union 文件系統(Union file systems)和容器格式(Container format)。
我們知道,在操作系統中,包括內核、文件系統、網絡、PID、UID、IPC、內存、硬盤、CPU 等等,所有的資源都是應用進程直接共享的。 要想實現虛擬化,除了要實現對內存、CPU、網絡IO、硬盤IO、存儲空間等的限制外,還要實現文件系統、網絡、PID、UID、IPC等等的相互隔離。 前者相對容易實現一些,后者則需要宿主機系統的深入支持。
隨著 Linux 系統對于命名空間功能的完善實現,程序員已經可以實現上面的所有需求,讓某些進程在彼此隔離的命名空間中運行。大家雖然都共用一個內核和某些運行時環境(例如一些系統命令和系統庫),但是彼此卻看不到,都以為系統中只有自己的存在。這種機制就是容器(Container),利用命名空間來做權限的隔離控制,利用 cgroups 來做資源分配。
基本架構
Docker 采用了 C/S 架構,包括客戶端和服務端。Docker 守護進程 ( Daemon )作為服務端接受來自客戶端的請求,并處理這些請求(創建、運行、分發容器)。
客戶端和服務端既可以運行在一個機器上,也可通過 socket 或者 RESTful API 來進行通信。
Docker 守護進程一般在宿主主機后臺運行,等待接收來自客戶端的消息。
Docker 客戶端則為用戶提供一系列可執行命令,用戶用這些命令實現跟 Docker 守護進程交互。
命名空間
命名空間是 Linux 內核一個強大的特性。每個容器都有自己單獨的命名空間,運行在其中的應用都像是在獨立的操作系統中運行一樣。命名空間保證了容器之間彼此互不影響。
pid 命名空間
net 命名空間
ipc 命名空間
mnt 命名空間
uts 命名空間
user 命名空間
控制組
控制組(cgroups)是 Linux 內核的一個特性,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容器的資源,才能避免當多個容器同時運行時的對系統資源的競爭。
控制組可以提供對容器的內存、CPU、磁盤 IO 等資源的限制和審計管理。
聯合文件系統
聯合文件系統(UnionFS)是一種分層、輕量級并且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。
聯合文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
Docker 中使用的 AUFS(AnotherUnionFS)就是一種聯合文件系統。 AUFS 支持為每一個成員目錄(類似 Git 的分支)設定只讀(readonly)、讀寫(readwrite)和寫出(whiteoutable)權限, 同時 AUFS 里有一個類似分層的概念, 對只讀權限的分支可以邏輯上進行增量地修改(不影響只讀部分的)。
Docker 目前支持的聯合文件系統包括 OverlayFS , AUFS , Btrfs , VFS , ZFS 和 Device Mapper 。
在可能的情況下,推薦使用overlay2 存儲驅動, overlay2 是目前 Docker 默認的存儲驅動,以前則是aufs。
容器格式
使用 runC 和 containerd。
網絡
Docker 的網絡實現其實就是利用了 Linux 上的網絡命名空間和虛擬網絡設備(特別是 veth pair)
總結
以上是生活随笔為你收集整理的linux内核中用来对共享资源进行隔离,简单理解Docker的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux怎么开ssh端口,如何查看li
- 下一篇: 查看linux机器性能,Unix Li