-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
底層原理(底層原理up主為什么不更了)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于底層原理的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
ChatGPT國內(nèi)免費(fèi)在線使用,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com
本文目錄:
一、Docker的底層原理實(shí)現(xiàn)(二十)
Docker 采用了 C/S 架構(gòu),包括客戶端和服務(wù)端。Docker 守護(hù)進(jìn)程 ( Daemon )作為服務(wù)端接受來自客戶端的請求,并處理這些請求(創(chuàng)建、運(yùn)行、分發(fā)容器)。
客戶端和服務(wù)端既可以運(yùn)行在一個機(jī)器上,也可通過 socket 或者 RESTful API 來進(jìn)行通信。
命名空間是 Linux 內(nèi)核一個強(qiáng)大的特性。每個容器都有自己單獨(dú)的命名空間,運(yùn)行在其中的 應(yīng)用都像是在獨(dú)立的操作系統(tǒng)中運(yùn)行一樣。命名空間保證了容器之間彼此互不影響。
不同用戶的進(jìn)程就是通過 pid 命名空間隔離開的,且不同命名空間中可以有相同 pid。所有的 LXC 進(jìn)程在 Docker 中的父進(jìn)程為Docker進(jìn)程,每個 LXC 進(jìn)程具有不同的命名空間。同時由 于允許嵌套,因此可以很方便的實(shí)現(xiàn)嵌套的 Docker 容器。
有了 pid 命名空間, 每個命名空間中的 pid 能夠相互隔離,但是網(wǎng)絡(luò)端口還是共享 host 的端 口。網(wǎng)絡(luò)隔離是通過 net 命名空間實(shí)現(xiàn)的, 每個 net 命名空間有獨(dú)立的 網(wǎng)絡(luò)設(shè)備, IP 地址, 路由表, /proc/net 目錄。這樣每個容器的網(wǎng)絡(luò)就能隔離開來。Docker 默認(rèn)采用 veth 的方式,將 容器中的虛擬網(wǎng)卡同 host 上的一個 Docker 網(wǎng)橋 docker0 連接在一起。
容器中進(jìn)程交互還是采用了 Linux 常見的進(jìn)程間交互方法(interprocess communication - IPC), 包括信號量、消息隊(duì)列和共享內(nèi)存等。然而同 VM 不同的是,容器的進(jìn)程間交互實(shí)際上還是 host 上具有相同 pid 命名空間中的進(jìn)程間交互,因此需要在 IPC 資源申請時加入命名空間信息,每個 IPC 資源有一個唯一的 32 位 id。
類似 chroot,將一個進(jìn)程放到一個特定的目錄執(zhí)行。mnt 命名空間允許不同命名空間的進(jìn)程看到的文件結(jié)構(gòu)不同,這樣每個命名空間中的進(jìn)程所看到的文件目錄就被隔離開了。同 chroot 不同,每個命名空間中的容器在 /proc/mounts 的信息只包含所在命名空間的 mount point。
UTS("UNIX Time-sharing System") 命名空間允許每個容器擁有獨(dú)立的 hostname 和 domain name, 使其在網(wǎng)絡(luò)上可以被視作一個獨(dú)立的節(jié)點(diǎn)而非主機(jī)上的一個進(jìn)程。
每個容器可以有不同的用戶和組 id, 也就是說可以在容器內(nèi)用容器內(nèi)部的用戶執(zhí)行程序而非主機(jī)上的用戶。
控制組(cgroups)是 Linux 內(nèi)核的一個特性,主要用來對共享資源進(jìn)行隔離、限制、審計 等。只有能控制分配到容器的資源,才能避免當(dāng)多個容器同時運(yùn)行時的對系統(tǒng)資源的競爭。
聯(lián)合文件系統(tǒng)(UnionFS)是一種分層、輕量級并且高性能的文件系統(tǒng),它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。
聯(lián)合文件系統(tǒng)是 Docker 鏡像的基礎(chǔ)。鏡像可以通過分層來進(jìn)行繼承,基于基礎(chǔ)鏡像(沒有父 鏡像),可以制作各種具體的應(yīng)用鏡像。
另外,不同 Docker 容器就可以共享一些基礎(chǔ)的文件系統(tǒng)層,同時再加上自己獨(dú)有的改動層, 大大提高了存儲的效率。
Docker 中使用的 AUFS(AnotherUnionFS)就是一種聯(lián)合文件系統(tǒng)。 AUFS 支持為每一個 成員目錄(類似 Git 的分支)設(shè)定只讀(readonly)、讀寫(readwrite)和寫出(whiteoutable)權(quán)限, 同時 AUFS 里有一個類似分層的概念, 對只讀權(quán)限的分支可以邏輯上進(jìn)行增量地修改(不影響只讀部分的)。
Docker 目前支持的聯(lián)合文件系統(tǒng)包括 OverlayFS, AUFS, Btrfs, VFS, ZFS 和 Device Mapper。
最初,Docker 采用了 LXC 中的容器格式。從 0.7 版本以后開始去除 LXC,轉(zhuǎn)而使用自行開 發(fā)的 libcontainer ,從 1.11 開始,則進(jìn)一步演進(jìn)為使用 runC 和 containerd 。
Docker 的網(wǎng)絡(luò)實(shí)現(xiàn)其實(shí)就是利用了 Linux 上的網(wǎng)絡(luò)命名空間和虛擬網(wǎng)絡(luò)設(shè)備(特別是 veth pair)。
首先,要實(shí)現(xiàn)網(wǎng)絡(luò)通信,機(jī)器需要至少一個網(wǎng)絡(luò)接口(物理接口或虛擬接口)來收發(fā)數(shù)據(jù)包;此外,如果不同子網(wǎng)之間要進(jìn)行通信,需要路由機(jī)制。
Docker 中的網(wǎng)絡(luò)接口默認(rèn)都是虛擬的接口。虛擬接口的優(yōu)勢之一是轉(zhuǎn)發(fā)效率較高。 Linux 通 過在內(nèi)核中進(jìn)行數(shù)據(jù)復(fù)制來實(shí)現(xiàn)虛擬接口之間的數(shù)據(jù)轉(zhuǎn)發(fā),發(fā)送接口的發(fā)送緩存中的數(shù)據(jù)包 被直接復(fù)制到接收接口的接收緩存中。對于本地系統(tǒng)和容器內(nèi)系統(tǒng)看來就像是一個正常的以 太網(wǎng)卡,只是它不需要真正同外部網(wǎng)絡(luò)設(shè)備通信,速度要快很多。
Docker 容器網(wǎng)絡(luò)就利用了這項(xiàng)技術(shù)。它在本地主機(jī)和容器內(nèi)分別創(chuàng)建一個虛擬接口,并讓它 們彼此連通(這樣的一對接口叫做 veth pair )。
Docker 創(chuàng)建一個容器的時候,會執(zhí)行如下操作:
完成這些之后,容器就可以使用 eth0 虛擬網(wǎng)卡來連接其他容器和其他網(wǎng)絡(luò)??梢栽?docker run 的時候通過 --net 參數(shù)來指定容器的網(wǎng)絡(luò)配置:
二、Redis的五種數(shù)據(jù)結(jié)構(gòu)及其底層實(shí)現(xiàn)原理
redis的字符串類型是由一種叫做簡單動態(tài)字符串(SDS)的數(shù)據(jù)類型來實(shí)現(xiàn)
SDC和C語言字符串的區(qū)別:
1:SDS保存了字符串的長度,而C語言不保存,只能遍歷找到第一個