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

Docker探索namespace詳解

 更新時間:2017年10月20日 11:01:18   作者:self-motivation  
以前對docker中的namespace了解甚少,今天在網(wǎng)上查閱相關(guān)文章,發(fā)現(xiàn)這篇還不錯,介紹了namespace資源隔離以及進行namespace api操作的四種方式等內(nèi)容,這里分享給大家,供參考。

Docker通過namespace實現(xiàn)了資源隔離,通過cgroups實現(xiàn)了資源限制,通過寫時復(fù)制(copy-on-write)實現(xiàn)了高效的文件操作。

1.namespace資源隔離

namepsace的6項隔離:

namespace
系統(tǒng)調(diào)用參數(shù)
隔離內(nèi)容
UTS
CLONE_NEWUTS
主機名與域名
IPC
CLONE_NEWIPC
信號量,消息隊列和共享內(nèi)存
PID
CLONE_NEWPID
進程編號
Network
CLONE_NEWNET
網(wǎng)絡(luò)設(shè)備,網(wǎng)絡(luò)棧,端口等
Mount
CLONE_NEWNS
掛載點(文件系統(tǒng))
User
CLONE_NEWUSER
用戶和用戶組

Linux內(nèi)核實現(xiàn)namespace的主要目的之一是實現(xiàn)輕量級虛擬化(容器)服務(wù)。在同一個namespace下的進程可以感知彼此的變化,而對外界進程一無所知。這樣就可以讓容器中的進程產(chǎn)生錯覺,仿佛自己置身于一個獨立的系統(tǒng)環(huán)境中,以達到獨立和隔離的目的。

進行namespace API操作的4種方式

  namespace的API包括clone(),setns()以及unshare(),還有/proc下的部分文件。為了確定隔離的到底是哪6項namespace,在使用這些API時,通常需要指定以下6個參數(shù)的一個或多個,通過位或操作來實現(xiàn)。

CLONE_NEWUTS,CLONE_NEWIPC,CLONE_NEWPID,CLONE_NEWNET,CLONE_NEWNS,CLONE_NEWUSER.

通過clone()在創(chuàng)建新進程的同時創(chuàng)建namespace

使用clone()來創(chuàng)建一個獨立namespace的進程是最常見的做法,也是Docker使用namespace的最基本的方法,它的調(diào)用方式如下。

NAME 
    clone, __clone2 - create a child process 
SYNOPSIS 
    /* Prototype for the glibc wrapper function */ 
    #include <sched.h> 
    int clone(int (*fn)(void *), void *child_stack, 
         int flags, void *arg, ... 
         /* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ ); 

clone()實際上是fork系統(tǒng)調(diào)用的一種更通用的實現(xiàn)方式,它可以通過flags來控制使用多少功能。一共有20多種CLONE_*的flag(標志位)參數(shù)用來控制clone進程的方方面面(如是否與父進程共享虛擬內(nèi)存等).

查看/proc/[pid]/ns文件

從3.8版本內(nèi)核開始,用戶可以在該文件下看到指向不同namespace號的文件:

 ls -l /proc/2597/ns
total 0
lrwxrwxrwx 1 zhangxa zhangxa 0 Mar 2 06:42 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 zhangxa zhangxa 0 Mar 2 06:42 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 zhangxa zhangxa 0 Mar 2 06:42 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 zhangxa zhangxa 0 Mar 2 06:42 net -> net:[4026531957]
lrwxrwxrwx 1 zhangxa zhangxa 0 Mar 2 06:42 pid -> pid:[4026531836]
lrwxrwxrwx 1 zhangxa zhangxa 0 Mar 2 06:42 user -> user:[4026531837]
lrwxrwxrwx 1 zhangxa zhangxa 0 Mar 2 06:42 uts -> uts:[4026531838]

如果2個進程namespace號相同,說明它們在同一個namespace下。

/proc/[pid]/ns里設(shè)置這些符號鏈接的另一個作用是,一旦上述鏈接文件被打開,那么就算該namespace下的所有進程都已經(jīng)結(jié)束,這個namespace也會一直存在,后續(xù)進程也可以再加進來。在Docker中,通過文件描述符定位和加入一個存在的namespace是最基本的方式。

另外,把/proc/[pid]/ns目錄文件使用--bind方式掛載起來可以直到同樣的作用:

# mount --bind /proc/2454/ns/uts uts

通過setns()加入一個已經(jīng)存在的namespace

上面提到,在進程都結(jié)束的情況下,也可以通過掛載的形式把namespace保留下來,保留namespace的目的是為以后有進程加入做準備。在Docker中,使用docker exec命令在已經(jīng)運行著的容器中執(zhí)行一個新命令,就需要用到該方法。通過setns()系統(tǒng)調(diào)用,進程從原先的namespace加入某個已經(jīng)存在的namespace,使用方法如下。通常為了不影響進程的調(diào)用者,也為了使新加入的pid namespace生效,會在setns()函數(shù)執(zhí)行后使用clone創(chuàng)建子進程繼續(xù)執(zhí)行命令,讓原先的進程結(jié)束。

NAME 
    setns - reassociate thread with a namespace 
SYNOPSIS 
    #define _GNU_SOURCE       /* See feature_test_macros(7) */ 
    #include <sched.h> 
    int setns(int fd, int nstype); 
fd = open(argv[1],O_RDONLY); 
setns(fd,0); 
execvp(argv[2],&argv[2]); 

假設(shè)編譯后的程序為"setns-test"
# ./setns-test ~/uts /bin/bash

至此,就可以在新加入的namespace中執(zhí)行shell命令了。

通過unshare()在原先進程上進行namespace隔離

它與clone()很像,不同的是,unshare()運行在原先的進程上,不需要啟動一個新進程。

NAME 
    unshare - disassociate parts of the process execution context 
SYNOPSIS 
    #include <sched.h> 
    int unshare(int flags); 

調(diào)用unshare()的主要作用就是不啟動一個新進程就可以起到隔離的效果,相當跳出原先的namespace進行操作。這樣,就可以在原進程進行一些需要隔離的操作。Linux自帶的unshare命令,就是通過unshare()系統(tǒng)調(diào)用實現(xiàn)的。Docker目前并沒有使用這個系統(tǒng)調(diào)用。

總結(jié)

以上就是本文關(guān)于Docker探索namespace詳解的全部內(nèi)容,希望對大家有所幫助,感興趣的朋友可以繼續(xù)參閱本站:淺談Docker安全機制內(nèi)核安全與容器之間的網(wǎng)絡(luò)安全、詳解Docker使用Linux iptables 和 Interfaces管理容器網(wǎng)絡(luò)等,有什么問題可以隨時留言,小編會及時回復(fù)大家的。感謝朋友們對本站的支持!

相關(guān)文章

  • 在Docker中的ubuntu中安裝Python3和Pip的問題

    在Docker中的ubuntu中安裝Python3和Pip的問題

    這篇文章主要介紹了在Docker中的ubuntu中安裝Python3和Pip的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 解決Jenkins集成docker插件問題的一些方法

    解決Jenkins集成docker插件問題的一些方法

    本文主要介紹了Jenkins集成docker插件問題的一些方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • docker建立私有倉庫的過程

    docker建立私有倉庫的過程

    這篇文章主要介紹了docker私有倉庫的建立,在這需要注意從私有倉庫下載先移出原鏡像,具體操作過程跟隨小編一起看看吧
    2022-01-01
  • Docker鏡像的commit操作示例及作用

    Docker鏡像的commit操作示例及作用

    這篇文章主要為大家介紹了Docker鏡像的commit操作示例及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • 在Docker中安裝OnlyOffice的詳細過程記錄

    在Docker中安裝OnlyOffice的詳細過程記錄

    OnlyOffice是一款免費且開源的Office協(xié)作辦公套件,支持桌面端和移動端等多平臺,下面這篇文章主要給大家介紹了關(guān)于如何在Docker中安裝OnlyOffice的詳細過程記錄,需要的朋友可以參考下
    2024-01-01
  • IDEA通過Docker插件部署SpringBoot項目的過程詳解

    IDEA通過Docker插件部署SpringBoot項目的過程詳解

    在idea中如何通過Docker插件部署SpringBoot項目呢?很多朋友在配置過程中走了很多誤區(qū),今天小編給大家分享一篇教程關(guān)于IDEA通過Docker插件部署SpringBoot項目的過程,感興趣的朋友一起看看吧
    2021-11-11
  • Docker-Compose搭建Redis集群的實現(xiàn)教程

    Docker-Compose搭建Redis集群的實現(xiàn)教程

    本文主要介紹了Docker-Compose搭建Redis集群的實現(xiàn)教程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Docker部署Consul配置過程解析

    Docker部署Consul配置過程解析

    這篇文章主要介紹了Docker部署Consul配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • 基于Docker+Jenkins實現(xiàn)自動化部署的方法

    基于Docker+Jenkins實現(xiàn)自動化部署的方法

    這篇文章主要介紹了基于Docker+Jenkins實現(xiàn)自動化部署,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 基于Docker的Etcd分布式部署的方法步驟

    基于Docker的Etcd分布式部署的方法步驟

    這篇文章主要介紹了基于Docker的Etcd分布式部署的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12

最新評論