HOME 首頁(yè)
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    底層原理(底層原理up主為什么不更了)

    發(fā)布時(shí)間:2023-03-13 21:37:00     稿源: 創(chuàng)意嶺    閱讀: 129        問(wèn)大家

    大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于底層原理的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。

    ChatGPT國(guó)內(nèi)免費(fèi)在線使用,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端

    官網(wǎng):https://ai.de1919.com

    本文目錄:

    底層原理(底層原理up主為什么不更了)

    一、Docker的底層原理實(shí)現(xiàn)(二十)

    Docker 采用了 C/S 架構(gòu),包括客戶端和服務(wù)端。Docker 守護(hù)進(jìn)程 ( Daemon )作為服務(wù)端接受來(lái)自客戶端的請(qǐng)求,并處理這些請(qǐng)求(創(chuàng)建、運(yùn)行、分發(fā)容器)。

    客戶端和服務(wù)端既可以運(yùn)行在一個(gè)機(jī)器上,也可通過(guò) socket 或者 RESTful API 來(lái)進(jìn)行通信。

    命名空間是 Linux 內(nèi)核一個(gè)強(qiáng)大的特性。每個(gè)容器都有自己?jiǎn)为?dú)的命名空間,運(yùn)行在其中的 應(yīng)用都像是在獨(dú)立的操作系統(tǒng)中運(yùn)行一樣。命名空間保證了容器之間彼此互不影響。

    不同用戶的進(jìn)程就是通過(guò) pid 命名空間隔離開(kāi)的,且不同命名空間中可以有相同 pid。所有的 LXC 進(jìn)程在 Docker 中的父進(jìn)程為Docker進(jìn)程,每個(gè) LXC 進(jìn)程具有不同的命名空間。同時(shí)由 于允許嵌套,因此可以很方便的實(shí)現(xiàn)嵌套的 Docker 容器。

    有了 pid 命名空間, 每個(gè)命名空間中的 pid 能夠相互隔離,但是網(wǎng)絡(luò)端口還是共享 host 的端 口。網(wǎng)絡(luò)隔離是通過(guò) net 命名空間實(shí)現(xiàn)的, 每個(gè) net 命名空間有獨(dú)立的 網(wǎng)絡(luò)設(shè)備, IP 地址, 路由表, /proc/net 目錄。這樣每個(gè)容器的網(wǎng)絡(luò)就能隔離開(kāi)來(lái)。Docker 默認(rèn)采用 veth 的方式,將 容器中的虛擬網(wǎng)卡同 host 上的一個(gè) Docker 網(wǎng)橋 docker0 連接在一起。

    容器中進(jìn)程交互還是采用了 Linux 常見(jiàn)的進(jìn)程間交互方法(interprocess communication - IPC), 包括信號(hào)量、消息隊(duì)列和共享內(nèi)存等。然而同 VM 不同的是,容器的進(jìn)程間交互實(shí)際上還是 host 上具有相同 pid 命名空間中的進(jìn)程間交互,因此需要在 IPC 資源申請(qǐng)時(shí)加入命名空間信息,每個(gè) IPC 資源有一個(gè)唯一的 32 位 id。

    類似 chroot,將一個(gè)進(jìn)程放到一個(gè)特定的目錄執(zhí)行。mnt 命名空間允許不同命名空間的進(jìn)程看到的文件結(jié)構(gòu)不同,這樣每個(gè)命名空間中的進(jìn)程所看到的文件目錄就被隔離開(kāi)了。同 chroot 不同,每個(gè)命名空間中的容器在 /proc/mounts 的信息只包含所在命名空間的 mount point。

    UTS("UNIX Time-sharing System") 命名空間允許每個(gè)容器擁有獨(dú)立的 hostname 和 domain name, 使其在網(wǎng)絡(luò)上可以被視作一個(gè)獨(dú)立的節(jié)點(diǎn)而非主機(jī)上的一個(gè)進(jìn)程。

    每個(gè)容器可以有不同的用戶和組 id, 也就是說(shuō)可以在容器內(nèi)用容器內(nèi)部的用戶執(zhí)行程序而非主機(jī)上的用戶。

    控制組(cgroups)是 Linux 內(nèi)核的一個(gè)特性,主要用來(lái)對(duì)共享資源進(jìn)行隔離、限制、審計(jì) 等。只有能控制分配到容器的資源,才能避免當(dāng)多個(gè)容器同時(shí)運(yùn)行時(shí)的對(duì)系統(tǒng)資源的競(jìng)爭(zhēng)。

    聯(lián)合文件系統(tǒng)(UnionFS)是一種分層、輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系統(tǒng)的修改作為一次提交來(lái)一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。

    聯(lián)合文件系統(tǒng)是 Docker 鏡像的基礎(chǔ)。鏡像可以通過(guò)分層來(lái)進(jìn)行繼承,基于基礎(chǔ)鏡像(沒(méi)有父 鏡像),可以制作各種具體的應(yīng)用鏡像。

    另外,不同 Docker 容器就可以共享一些基礎(chǔ)的文件系統(tǒng)層,同時(shí)再加上自己獨(dú)有的改動(dòng)層, 大大提高了存儲(chǔ)的效率。

    Docker 中使用的 AUFS(AnotherUnionFS)就是一種聯(lián)合文件系統(tǒng)。 AUFS 支持為每一個(gè) 成員目錄(類似 Git 的分支)設(shè)定只讀(readonly)、讀寫(readwrite)和寫出(whiteoutable)權(quán)限, 同時(shí) AUFS 里有一個(gè)類似分層的概念, 對(duì)只讀權(quán)限的分支可以邏輯上進(jìn)行增量地修改(不影響只讀部分的)。

    Docker 目前支持的聯(lián)合文件系統(tǒng)包括 OverlayFS, AUFS, Btrfs, VFS, ZFS 和 Device Mapper。

    最初,Docker 采用了 LXC 中的容器格式。從 0.7 版本以后開(kāi)始去除 LXC,轉(zhuǎn)而使用自行開(kāi) 發(fā)的 libcontainer ,從 1.11 開(kāi)始,則進(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ī)器需要至少一個(gè)網(wǎng)絡(luò)接口(物理接口或虛擬接口)來(lái)收發(fā)數(shù)據(jù)包;此外,如果不同子網(wǎng)之間要進(jìn)行通信,需要路由機(jī)制。

    Docker 中的網(wǎng)絡(luò)接口默認(rèn)都是虛擬的接口。虛擬接口的優(yōu)勢(shì)之一是轉(zhuǎn)發(fā)效率較高。 Linux 通 過(guò)在內(nèi)核中進(jìn)行數(shù)據(jù)復(fù)制來(lái)實(shí)現(xiàn)虛擬接口之間的數(shù)據(jù)轉(zhuǎn)發(fā),發(fā)送接口的發(fā)送緩存中的數(shù)據(jù)包 被直接復(fù)制到接收接口的接收緩存中。對(duì)于本地系統(tǒng)和容器內(nèi)系統(tǒng)看來(lái)就像是一個(gè)正常的以 太網(wǎng)卡,只是它不需要真正同外部網(wǎng)絡(luò)設(shè)備通信,速度要快很多。

    Docker 容器網(wǎng)絡(luò)就利用了這項(xiàng)技術(shù)。它在本地主機(jī)和容器內(nèi)分別創(chuàng)建一個(gè)虛擬接口,并讓它 們彼此連通(這樣的一對(duì)接口叫做 veth pair )。

    Docker 創(chuàng)建一個(gè)容器的時(shí)候,會(huì)執(zhí)行如下操作:

    完成這些之后,容器就可以使用 eth0 虛擬網(wǎng)卡來(lái)連接其他容器和其他網(wǎng)絡(luò)。可以在 docker run 的時(shí)候通過(guò) --net 參數(shù)來(lái)指定容器的網(wǎng)絡(luò)配置:

    二、Redis的五種數(shù)據(jù)結(jié)構(gòu)及其底層實(shí)現(xiàn)原理

    redis的字符串類型是由一種叫做簡(jiǎn)單動(dòng)態(tài)字符串(SDS)的數(shù)據(jù)類型來(lái)實(shí)現(xiàn)

    SDC和C語(yǔ)言字符串的區(qū)別:

    1:SDS保存了字符串的長(zhǎng)度,而C語(yǔ)言不保存,只能遍歷找到第一個(gè)