(1)Namespace

namespace介紹:

linux namespace 是kernel 的一個(gè)功能,他可以隔離一系列的資源,比如PID ,UsrID,Network
當(dāng)前l(fā)inux 一共實(shí)現(xiàn)了6種不同類型的NameSpace
接下來(lái)我們看看怎么用go語(yǔ)言來(lái)調(diào)用namespace來(lái)實(shí)現(xiàn)環(huán)境隔離。

(1)UTS NameSpace 主要用來(lái)隔離nodename和domainname

package main
import (
"os/exec"
"syscall"
"os"
"log"
)
/**
因?yàn)橐褂胠inux 內(nèi)核,所以不能在其他平臺(tái)上運(yùn)行
 */
func main() {
   cmd := exec.Command("sh")
   cmd.SysProcAttr = &syscall.SysProcAttr{
      Cloneflags: syscall.CLONE_NEWUTS,
   }
   cmd.Stdin = os.Stdin
   cmd.Stdout = os.Stdout
   cmd.Stderr = os.Stderr

   if err := cmd.Run(); err!=nil{
      log.Fatal(err)
   }

}

驗(yàn)證
執(zhí)行代碼,查看進(jìn)程信息
go run utsnamespace.go
pstree -pl


進(jìn)程信息
父進(jìn)程和子進(jìn)程uts

很明顯可以看到 父進(jìn)程和 子進(jìn)程不在一個(gè)uts中

(2)IPC NameSpace用來(lái)隔離System v IPC 和 POSIX message queues

package main

import (
"os/exec"
"syscall"
"os"
"log"
)

/**
因?yàn)橐褂胠inux 內(nèi)核,所以不能在其他平臺(tái)上運(yùn)行
 */
func main() {
   //sh 為被fork 出的新進(jìn)場(chǎng)的初始命令
   cmd := exec.Command("sh")
   cmd.SysProcAttr = &syscall.SysProcAttr{
      Cloneflags: syscall.CLONE_NEWUTS |syscall.CLONE_NEWIPC,
   }
   cmd.Stdin = os.Stdin
   cmd.Stdout = os.Stdout
   cmd.Stderr = os.Stderr

   if err := cmd.Run(); err!=nil{
      log.Fatal(err)
   }

}

驗(yàn)證
在宿主機(jī)上開個(gè)終端
ipcs -q 無(wú)queue
ipcmk -Q 創(chuàng)建queue
ipcs -q 查看發(fā)現(xiàn)有一個(gè)queue
此時(shí)運(yùn)行ipcnamespace.go
gor run ipcnamespace.go
ipcs -q 無(wú)queue
說(shuō)明 該環(huán)境和外部是隔離的


宿主機(jī)ipcs
隔離環(huán)境ipcs

(3)PID Namespace ,用來(lái)隔離進(jìn)程ID. 例如某個(gè)進(jìn)程在容器里面 的進(jìn)程pid 和在宿主機(jī)上查看是不一樣的。

package main

import (
"os/exec"
"syscall"
"os"
"log"
)

/**
因?yàn)橐褂胠inux 內(nèi)核,所以不能在其他平臺(tái)上運(yùn)行
 */
func main() {
   //sh 為被fork 出的新進(jìn)場(chǎng)的初始命令
   cmd := exec.Command("sh")
   cmd.SysProcAttr = &syscall.SysProcAttr{
      Cloneflags: syscall.CLONE_NEWUTS |syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID,
   }
   cmd.Stdin = os.Stdin
   cmd.Stdout = os.Stdout
   cmd.Stderr = os.Stderr

   if err := cmd.Run(); err!=nil{
      log.Fatal(err)
   }

}

驗(yàn)證
運(yùn)行pidnamespace.go ,查看pid 為1
其在宿主機(jī)的pid為15814


宿主機(jī)中的pid
隔離環(huán)境中的pid

(4)Mount Namespace 用來(lái)隔離各個(gè)進(jìn)程看到的掛載點(diǎn)試圖

package main

import (
"os/exec"
"syscall"
"os"
"log"
)

/**
因?yàn)橐褂胠inux 內(nèi)核,所以不能在其他平臺(tái)上運(yùn)行
 */
func main() {
    //sh 為被fork 出的新進(jìn)場(chǎng)的初始命令
    cmd := exec.Command("sh")
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Cloneflags: syscall.CLONE_NEWUTS |syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWNS,
    }
    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    if err := cmd.Run(); err!=nil{
        log.Fatal(err)
    }

}

驗(yàn)證:
go mountnamespace.go
ls /proc 查看(此時(shí)文件還比較多)
mount -t proc proc /proc 將proc 掛載到我們自己的namespace下
ls /proc 查看(少了許多)

proc

(5)User Namespace 主要用來(lái)隔離用戶的用戶組ID 比較常用的是 在宿主機(jī)上以一個(gè)非root用戶運(yùn)行創(chuàng)建一個(gè)User Namespace 然后在User Namespace映射成root

package main

import (
"os/exec"
"syscall"
"os"
"log"
)

/**
因?yàn)橐褂胠inux 內(nèi)核,所以不能在其他平臺(tái)上運(yùn)行
 */
func main() {
   //sh 為被fork 出的新進(jìn)場(chǎng)的初始命令
   cmd := exec.Command("sh")
   cmd.SysProcAttr = &syscall.SysProcAttr{
      Cloneflags: syscall.CLONE_NEWUTS |syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWNS|syscall.CLONE_NEWUSER,
   }
   cmd.Stdin = os.Stdin
   cmd.Stdout = os.Stdout
   cmd.Stderr = os.Stderr

   if err := cmd.Run(); err!=nil{
      log.Fatal(err)
   }

}

驗(yàn)證 (內(nèi)核版本要3.8以上,我一開始使用的是2.6.32的就無(wú)法創(chuàng)建User Namespace)

內(nèi)核2.6不能創(chuàng)建user namespacve
4.12的內(nèi)核

(6)Network NameSpace 主要用來(lái)隔離網(wǎng)絡(luò)設(shè)備、IP地址端口等網(wǎng)絡(luò)棧

package main

import (
"os/exec"
"syscall"
"os"
"log"
)

/**
因?yàn)橐褂胠inux 內(nèi)核,所以不能在其他平臺(tái)上運(yùn)行
 */
func main() {
   //sh 為被fork 出的新進(jìn)場(chǎng)的初始命令
   cmd := exec.Command("sh")
   cmd.SysProcAttr = &syscall.SysProcAttr{
      Cloneflags: syscall.CLONE_NEWUTS |syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWNS|syscall.CLONE_NEWUSER|syscall.CLONE_NEWNET,
   }
   cmd.Stdin = os.Stdin
   cmd.Stdout = os.Stdout
   cmd.Stderr = os.Stderr

   if err := cmd.Run(); err!=nil{
      log.Fatal(err)
   }

}

驗(yàn)證
在宿主機(jī)上執(zhí)行ifconfig 可以看到有eth0 和 lo 網(wǎng)絡(luò)設(shè)備
運(yùn)行networknamespace.go,在此環(huán)境下無(wú)網(wǎng)絡(luò)設(shè)備


網(wǎng)絡(luò)驗(yàn)證
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 寫這個(gè)系列文章主要是對(duì)之前做項(xiàng)目用到的docker相關(guān)技術(shù)做一些總結(jié),包括docker基礎(chǔ)技術(shù)Linux命名空間,...
    __七把刀__閱讀 5,927評(píng)論 0 16
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,764評(píng)論 0 120
  • 今天的三種感受:平靜,愉快,溫暖 今天的小進(jìn)步:今天老公加班到晚上10點(diǎn)多才回來(lái),我熱烈歡迎他回來(lái),小寶和奶奶已睡...
    小嬪_1e27閱讀 75評(píng)論 0 0
  • 感恩日記第三十二天:感恩是最好的祝福,感恩是最棒的祈禱,感恩是幸福的源泉,感恩是愛(ài)的頂點(diǎn) 1.感恩一天超的陪伴,對(duì)...
    豐盛富足閱讀 202評(píng)論 0 0
  • 這周七天畫了六幅思維導(dǎo)圖,感覺(jué)自己對(duì)思維導(dǎo)圖的作用更加熟練了,但是也有不足: 1、線條僵硬,不流暢 2、創(chuàng)意不夠,...
    萌萌噠老李閱讀 231評(píng)論 0 0

友情鏈接更多精彩內(nèi)容