当前位置:   article > 正文

自己动手写docker——Namespace

自己动手写docker——Namespace

Linux Namespace

linux Namespace用于隔离一系列的系统资源,例如pid,userid,netword等,借助于Linux Namespace,可以实现容器的基本隔离。

Namespce介绍

Namespace类型系统调用参数作用
Mount NamespaceCLONE_NEWNS隔离挂载点视图,简单来说隔离了mount命令
UTS NamespaceCLONE_NEWUTS隔离hostname
IPC NamespaceCLONE_NEWIPC隔离ipc与message queue
PID NamespaceCLONE_NEWPID隔离进程PID
Network NamespaceCLONE_NEWNET隔离network
User NamespaceCLONE_NEWUSER隔离userid和groupid

下面我们用Go程序创建一个隔离的进程

package main
​
import (
    "os"
    "os/exec"
    "syscall"
)
​
func main() {
    cmd := exec.Command("bash")
    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 {
       panic(err)
    }
​
}

我们可以通过一些命令来查看我们确实处于在了新的Namespace中,当然,因为我们使用了CLONE_NEWUSER参数,这让我们在Namespace中失去了用户身份,我们不能以root用户进行操作,如果要以root身份验证其他Namespace,需要删除CLONE_NEWUSER,然后以root身份运行程序。

这里我们可以简单验证PID Namespace,可以看到PID为1,隔离了PID

echo $$
1

验证User Namespace

id
uid=65534(nobody) gid=65534(nogroup) 组=65534(nogroup)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/632042
推荐阅读
相关标签
  

闽ICP备14008679号