微吼云上線多路互動直播服務 加速多場景互動直播落地
850
2025-03-31
開
一種沙盒技術,
可以將應用運行在其中,與外界隔離
這個沙盒可以被方便地“轉移”。
本質上,他就是一種特殊的進程。通過在創建容器進程的時候,指定了這個進程所需要啟用的一組Namespace參數,進而讓該容器進程只能看到當前Namespace所限定的資源、文件、設備、狀態或者配置。--進程劃分獨立空間思想
一組聯合掛載在/var/lib/docker/aufs/mnt上的rootfs,這部分被稱為“容器鏡像”(Container Image),是容器的靜態視圖
一個由Namespace + Cgroups構成的隔離環境,這部分被稱為“容器運行時”,是容器的動態視圖
docker framwork.PNG
在為待創建的用戶進程
啟動Linux Namespace配置
設置指定的Cgroups參數
切換進程的根目錄(change root, 配合namespace mount)
切換進程的根目錄的時,Docker項目會在最后一步優先使用pivot_root的系統調用,如果系統不支持,才會使用chroot。
虛擬機在物理宿主機上存在一層Hypervisor的硬件虛擬化層,通過Hypervisor虛擬化出了CPU, 內存,I/O設備等,然后在這些虛擬設備上裝了一個新的操作系統,即GuestOS,通過不同的操作系統,來實現同一個物理宿主機上的環境隔離。
因此,不能Docker engine放在和Hypervisor同樣的地位,Docker Engine或任何容器管理工具都不對容器中的應用進程的隔離環境負責,而是由物理宿主機的操作系統本身直接負責的。Hypervisor是會虛擬出硬件設備,在這上面通過不同的GuestOS實現隔離的。而Docker Engine在這里扮演的角色,更多是的旁路式的輔助和管理工作。
基于虛擬化和獨立內核技術的容器
容器和VM的對比
#TODO
容器編排.PNG
#TODO
狹義定義:進程是正在運行的程序的實例(an instance of a computer program that is being executed)。
廣義定義:進程是一個具有一定獨立功能的程序關于某個數據集合的一次運行活動。它是操作系統動態執行的基本單元,在傳統的操作系統中,進程既是基本的分配單元,也是基本的執行單元。
對進程來說,靜態表現就是程序,未運行時存儲在磁盤上;運行起來后,變成了計算機中數據和狀態的總和,也是其動態表現。
容器技術的核心功能,是通過約束和修改進程的動態表現,從而為其制造出一個容器的邊界。
雖然Docker容器可以通過Namespace改變進程視圖可見性,但是本質上容器這個進程及其內部的應用進程,都是統一歸宿主機的操作系統管理,這就意味著,這個容器內部的進程和容器外部的宿主機的進程時處于平等競爭關系的。那么問題來了,這些資源占用怎么去隔離?---Cgroups
限制一個進程族能夠使用的資源上限,包括CPU,內存,磁盤,網絡帶寬等。此外還能夠對進程進行優先級設置、審計、以及將進程掛起和恢復等操作。
詳見《Linux Cgroups》
容器中執行top指令,顯示的信息是宿主機的CPU和內存數據,不是當前容器的數據。因為/proc下的存儲的信息是作為top指令的主要數據來源,而/proc文件系統是感知不Cgroups限制的存在
修改進程視圖的主要方法。說白了,容器正是通過在起容器進程的時候,增加namespace的配置參數,使得在該容器內部可見的進程與容器外部(物理機OS)上看到的進程“隔離”開來。但是,在物理宿主機看來這些被“隔離”的進程與其他進程并沒有太大區別。
namespace problem.PNG
RPC.jpg
簡單理解:rpc調用能夠通過類似本地調用的方式實現在分布式架構中Service A調用起Service B的方法。
在上圖中,以左邊的Client端為例,Application就是rpc的調用方,Client Stub就是代理對象,也就是那個看起來像是Calculator(這個類是實際實現在右側Application中的)的實現類,其實內部是通過rpc方式來進行遠程調用的代理對象,至于Client Run-time Library,則是實現遠程調用的工具包,比如jdk的Socket,最后通過底層網絡實現實現數據的傳輸。
這個過程中最重要的就是序列化和反序列化了,因為數據傳輸的數據包必須是二進制的,你直接丟一個Java對象過去,人家可不認識,你必須把Java對象序列化為二進制格式,傳給Server端,Server端接收到之后,再反序列化為Java對象。
可以簡單這么理解
如果容器鏡像os支持某硬件的驅動,但是宿主機os如果不支持該硬件驅動的話,也白搭
可以理解為鏡像只是提供了一套鏡像文件系統中的各種文件,而各種內核相關的模塊或者特性支持,完全依賴于宿主機
也正是通過容器鏡像,打包了整個操作系統的文件和目錄(雖然沒打包內核),也就意味著,應用以及他所運行所需要的全部依賴都被封裝在了一起,而對于一個應用來說,操作系統本身才是他運行所需要的完整的依賴庫。也正是因為這樣,才有了容器的一個重要特性:一致性。
一致性
優雅地解決云端和本地服務環境不同造成在應用打包過程中使用PaaS最“痛苦”的步驟。
為什么說容器通過mount namespace掛載不同版本的操作系統文件,但是不同的Docker還是使用的操作系統內核。(通俗理解就是不能通過容器技術在Windows宿主機上運行Linux容器,或者在低版本的Linux宿主機上運行高版本的Linux容器)
是為了解決在通過rootfs機制(打包了操作系統所包含的文件、配置和目錄)和mount 那么space建立起了一個同宿主機完全隔離的文件環境系統同時引入的兩個問題:
宿主機上的文件系統,怎么讓容器的進程訪問到
總而言之,是在隔離開宿主機和容器的文件系統之后,怎么進行文件共享操作。
允許用戶將宿主機上指定的目錄或者文件,掛載到容器里面進行讀取和修改操作。
注意mount namespace在根目錄下掛載rootfs和Volume機制掛載的區別
rootfs掛載到根目錄是docker倉庫中打包的操作系統的文件系統
Volume機制是把物理機上的卷掛載到通過rootfs和mount namespace隔離開的容器卷上以達到容器和宿主機的文件共享目的
// mount /home on host to /test in container filesystem ?$ docker run -v /home:/test
云計算
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。