欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Docker基礎(chǔ)知識(shí)之Linux namespace圖文詳解

 更新時(shí)間:2018年03月14日 10:22:23   作者:bakari  
這篇文章主要給大家介紹了關(guān)于Docker基礎(chǔ)知識(shí)之Linux namespace的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

Docker 是“新瓶裝舊酒”的產(chǎn)物,依賴于 Linux 內(nèi)核技術(shù) chroot 、namespace 和 cgroup。本篇先來(lái)看 namespace 技術(shù)。

Docker 和虛擬機(jī)技術(shù)一樣,從操作系統(tǒng)級(jí)上實(shí)現(xiàn)了資源的隔離,它本質(zhì)上是宿主機(jī)上的進(jìn)程(容器進(jìn)程),所以資源隔離主要就是指進(jìn)程資源的隔離。實(shí)現(xiàn)資源隔離的核心技術(shù)就是 Linux namespace。這技術(shù)和很多語(yǔ)言的命名空間的設(shè)計(jì)思想是一致的(如 C++ 的 namespace)。

隔離意味著可以抽象出多個(gè)輕量級(jí)的內(nèi)核(容器進(jìn)程),這些進(jìn)程可以充分利用宿主機(jī)的資源,宿主機(jī)有的資源容器進(jìn)程都可以享有,但彼此之間是隔離的,同樣,不同容器進(jìn)程之間使用資源也是隔離的,這樣,彼此之間進(jìn)行相同的操作,都不會(huì)互相干擾,安全性得到保障。

為了支持這些特性,Linux namespace 實(shí)現(xiàn)了 6 項(xiàng)資源隔離,基本上涵蓋了一個(gè)小型操作系統(tǒng)的運(yùn)行要素,包括主機(jī)名、用戶權(quán)限、文件系統(tǒng)、網(wǎng)絡(luò)、進(jìn)程號(hào)、進(jìn)程間通信。

這 6 項(xiàng)資源隔離分別對(duì)應(yīng) 6 種系統(tǒng)調(diào)用,通過(guò)傳入上表中的參數(shù),調(diào)用 clone() 函數(shù)來(lái)完成。

int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);

clone() 函數(shù)相信大家都不陌生了,它是 fork() 函數(shù)更通用的實(shí)現(xiàn)方式,通過(guò)調(diào)用 clone() ,并傳入需要隔離資源對(duì)應(yīng)的參數(shù),就可以建立一個(gè)容器了(隔離什么我們自己控制)。

一個(gè)容器進(jìn)程也可以再 clone() 出一個(gè)容器進(jìn)程,這是容器的嵌套。

如果想要查看當(dāng)前進(jìn)程下有哪些 namespace 隔離,可以查看文件 /proc/[pid]/ns (注:該方法僅限于 3.8 版本以后的內(nèi)核)。

可以看到,每一項(xiàng) namespace 都附帶一個(gè)編號(hào),這是唯一標(biāo)識(shí) namespace 的,如果兩個(gè)進(jìn)程指向的 namespace 編號(hào)相同,則表示它們同在該 namespace 下。同時(shí)也注意到,多了一個(gè) cgroup,這個(gè) namespace 是 4.6 版本的內(nèi)核才支持的。Docker 目前對(duì)它的支持普及度還不高。所以我們暫時(shí)先不考慮它。

下面通過(guò)簡(jiǎn)單的代碼來(lái)實(shí)現(xiàn) 6 種 namespace 的隔離效果,讓大家有個(gè)直觀的印象。

UTS namespace

UTS namespace 提供了主機(jī)名和域名的隔離,這樣每個(gè)容器就擁有獨(dú)立的主機(jī)名和域名了,在網(wǎng)絡(luò)上就可以被視為一個(gè)獨(dú)立的節(jié)點(diǎn),在容器中對(duì) hostname 的命名不會(huì)對(duì)宿主機(jī)造成任何影響。

首先,先看總體的代碼骨架:

#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>
#define STACK_SIZE (1024 * 1024)

static char container_stack[STACK_SIZE];
char* const container_args[] = {
 "/bin/bash",
 NULL
};

// 容器進(jìn)程運(yùn)行的程序主函數(shù)
int container_main(void *args)
{
 printf("在容器進(jìn)程中!\n");
 execv(container_args[0], container_args); // 執(zhí)行/bin/bash return 1;
}

int main(int args, char *argv[])
{
 printf("程序開始\n");
 // clone 容器進(jìn)程
 int container_pid = clone(container_main, container_stack + STACK_SIZE, SIGCHLD, NULL);
 // 等待容器進(jìn)程結(jié)束
 waitpid(container_pid, NULL, 0);
 return 0;
}

該程序骨架調(diào)用 clone() 函數(shù)實(shí)現(xiàn)了子進(jìn)程的創(chuàng)建工作,并定義子進(jìn)程的執(zhí)行函數(shù),clone() 第二個(gè)參數(shù)指定了子進(jìn)程運(yùn)行的棧空間大小,第三個(gè)參數(shù)即為創(chuàng)建不同 namespace 隔離的關(guān)鍵。

對(duì)于 UTS namespace,傳入 CLONE_NEWUTS,如下:

int container_pid = clone(container_main, container_stack + STACK_SIZE, SIGCHLD | CLONE_NEWUTS, NULL);

為了能夠看出容器內(nèi)和容器外主機(jī)名的變化,我們子進(jìn)程執(zhí)行函數(shù)中加入:

sethostname("container", 9);

最終運(yùn)行可以看到效果如下:

IPC namespace

IPC namespace 實(shí)現(xiàn)了進(jìn)程間通信的隔離,包括常見的幾種進(jìn)程間通信機(jī)制,如信號(hào)量,消息隊(duì)列和共享內(nèi)存。我們知道,要完成 IPC,需要申請(qǐng)一個(gè)全局唯一的標(biāo)識(shí)符,即 IPC 標(biāo)識(shí)符,所以 IPC 資源隔離主要完成的就是隔離 IPC 標(biāo)識(shí)符。

同樣,代碼修改僅需要加入?yún)?shù) CLONE_NEWIPC 即可,如下:

int container_pid = clone(container_main, container_stack + STACK_SIZE, SIGCHLD | CLONE_NEWUTS | CLONE_NEWIPC, NULL);

為了看出變化,首先在宿主機(jī)上建立一個(gè)消息隊(duì)列:

然后運(yùn)行程序,進(jìn)入容器查看 IPC,沒有找到原先建立的 IPC 標(biāo)識(shí),達(dá)到了 IPC 隔離。

PID namespace

PID namespace 完成的是進(jìn)程號(hào)的隔離,同樣在 clone() 中加入 CLONE_NEWPID 參數(shù),如:

int container_pid = clone(container_main, container_stack + STACK_SIZE, SIGCHLD | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWPID, NULL);

效果如下,echo $$ 輸出 shell 的 PID 號(hào),發(fā)生了變化。

但是對(duì)于 ps/top 之類命令卻沒有改變:

具體的原因和接下來(lái)的內(nèi)容(包括 mount namespace,network namespace 和 user namespace),大家可以關(guān)注我的公眾號(hào)閱讀,那里的閱讀體驗(yàn)會(huì)更好一些。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • docker容器下配置jupyter notebook的操作

    docker容器下配置jupyter notebook的操作

    這篇文章主要介紹了docker容器下配置jupyter notebook的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • 解決docker CMD/ENTRYPOINT執(zhí)行sh腳本報(bào): not found/run.sh:

    解決docker CMD/ENTRYPOINT執(zhí)行sh腳本報(bào): not found/run.sh:

    這篇文章主要介紹了解決docker CMD/ENTRYPOINT執(zhí)行sh腳本報(bào): not found/run.sh:的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Docker部署Nuxt.js項(xiàng)目的實(shí)現(xiàn)

    Docker部署Nuxt.js項(xiàng)目的實(shí)現(xiàn)

    這篇文章主要介紹了Docker部署Nuxt.js項(xiàng)目的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Docker容器與主機(jī)間的文件傳輸方法(復(fù)制/上傳/下載)

    Docker容器與主機(jī)間的文件傳輸方法(復(fù)制/上傳/下載)

    這篇文章主要介紹了Docker容器與主機(jī)間的文件傳輸方法(復(fù)制/上傳/下載),需要的朋友可以參考下
    2018-02-02
  • jenkins+gitlab+nginx部署前端應(yīng)用實(shí)現(xiàn)

    jenkins+gitlab+nginx部署前端應(yīng)用實(shí)現(xiàn)

    在日常開發(fā)中,往往可能同時(shí)多個(gè)項(xiàng)目并行進(jìn)行開發(fā),本文介紹了jenkins+gitlab+nginx部署前端應(yīng)用實(shí)現(xiàn),感興趣的可以了解一下
    2021-05-05
  • docker操作鏡像、容器相關(guān)命令詳解

    docker操作鏡像、容器相關(guān)命令詳解

    這篇文章主要介紹了docker操作鏡像、容器相關(guān)命令,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • docker-compose如何實(shí)現(xiàn)滾動(dòng)更新

    docker-compose如何實(shí)現(xiàn)滾動(dòng)更新

    這篇文章主要介紹了docker-compose如何實(shí)現(xiàn)滾動(dòng)更新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Docker 部署Scrapy的詳解

    Docker 部署Scrapy的詳解

    這篇文章主要介紹了Docker 部署Scrapy的詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Docker?鏡像分層及dockerfile?編寫技巧

    Docker?鏡像分層及dockerfile?編寫技巧

    Docker鏡像是由特殊的文件系統(tǒng)疊加而成,鏡像層是不可變的,如果在某一層中添加一個(gè)文件,然后在下一層中刪除它,則鏡像中依然會(huì)包含該文件,這篇文章主要介紹了Docker?鏡像分層及dockerfile?編寫,需要的朋友可以參考下
    2022-01-01
  • Docker同時(shí)安裝MySQL和MariaDB的方法步驟

    Docker同時(shí)安裝MySQL和MariaDB的方法步驟

    這篇文章主要介紹了Docker同時(shí)安裝MySQL和MariaDB的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論