最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

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

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

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

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

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

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

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

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

下面通過簡單的代碼來實現(xiàn) 6 種 namespace 的隔離效果,讓大家有個直觀的印象。

UTS namespace

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

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

#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
};

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

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

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

對于 UTS namespace,傳入 CLONE_NEWUTS,如下:

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

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

sethostname("container", 9);

最終運行可以看到效果如下:

IPC namespace

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

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

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

為了看出變化,首先在宿主機上建立一個消息隊列:

然后運行程序,進入容器查看 IPC,沒有找到原先建立的 IPC 標識,達到了 IPC 隔離。

PID namespace

PID namespace 完成的是進程號的隔離,同樣在 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 號,發(fā)生了變化。

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

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

總結(jié)

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

相關(guān)文章

  • docker?system?prune命令使用示例詳解

    docker?system?prune命令使用示例詳解

    docker system prune是一個用于清理Docker系統(tǒng)資源的命令,它用于刪除未使用的數(shù)據(jù)(如未使用的鏡像、容器、網(wǎng)絡(luò)和存儲卷)以釋放磁盤空間,下面這篇文章主要給大家介紹了關(guān)于docker?system?prune命令使用示例的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • docker配置修改阿里云鏡像倉庫的實現(xiàn)

    docker配置修改阿里云鏡像倉庫的實現(xiàn)

    這篇文章主要介紹了docker配置修改阿里云鏡像倉庫的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • docker獲取Let''s Encrypt永久免費SSL證書的方法

    docker獲取Let''s Encrypt永久免費SSL證書的方法

    在本篇文章里小編給大家分享了一篇關(guān)于docker獲取Let's Encrypt永久免費SSL證書的方法,以后需要的朋友們可以參考下。
    2021-01-01
  • Docker掛載的三種方法及使用場景分析

    Docker掛載的三種方法及使用場景分析

    在Docker容器中,持久化存儲和數(shù)據(jù)共享是非常重要的功能,Docker提供了三種主要的方法來實現(xiàn)宿主機和容器之間的數(shù)據(jù)掛載,本文將詳細介紹這三種方法的基本語法,并探討它們各自的使用場景,需要的朋友可以參考下
    2024-05-05
  • Docker 部署Django項目的方法示例

    Docker 部署Django項目的方法示例

    這篇文章主要介紹了Docker 部署Django項目的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 關(guān)于docker啟動jenkins環(huán)境的問題

    關(guān)于docker啟動jenkins環(huán)境的問題

    這篇文章主要介紹了docker啟動jenkins環(huán)境的問題,文中提到了jenkins基本工作原理及管理員密碼獲取方法,對docker啟動jenkins環(huán)境相關(guān)知識感興趣的朋友一起看看吧
    2022-04-04
  • docker常用命令整理匯總(新手必備!)

    docker常用命令整理匯總(新手必備!)

    這篇文章主要給大家介紹了關(guān)于docker常用命令的相關(guān)資料,包括docker的啟動、停止、重啟、創(chuàng)建、查看等等,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • docker-entrypoint.sh文件的用處詳解

    docker-entrypoint.sh文件的用處詳解

    這篇文章主要介紹了docker-entrypoint.sh文件的用處,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 兩小時入門Docker教程實踐

    兩小時入門Docker教程實踐

    這篇文章主要介紹了兩小時入門Docker教程實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • 虛擬機如何安裝指定版本的Docker舉例詳解

    虛擬機如何安裝指定版本的Docker舉例詳解

    這篇文章主要介紹了虛擬機如何安裝指定版本的Docker的相關(guān)資料,包括配置yum源、查看可用版本、安裝指定版本、卸載舊版本、解決沖突、再次安裝以及最后驗證安裝,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-12-12

最新評論

怀来县| 陕西省| 濉溪县| 赞皇县| 乐安县| 如东县| 黔东| 肥东县| 丰都县| 那坡县| 佛山市| 哈尔滨市| 贵德县| 区。| 永顺县| 高邮市| 樟树市| 诸暨市| 青神县| 山东| 秦安县| 安丘市| 利津县| 黄龙县| 宁安市| 南郑县| 新乡县| 宁国市| 定边县| 仙游县| 康马县| 饶平县| 华蓥市| 三河市| 怀安县| 诸城市| 莎车县| 吴川市| 泾阳县| 洛浦县| 泽库县|