自己动手写docker——Namespace

Linux Namespace

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

Namespce介绍

Namespace类型 系统调用参数 作用
Mount Namespace CLONE_NEWNS 隔离挂载点视图,简单来说隔离了mount命令
UTS Namespace CLONE_NEWUTS 隔离hostname
IPC Namespace CLONE_NEWIPC 隔离ipc与message queue
PID Namespace CLONE_NEWPID 隔离进程PID
Network Namespace CLONE_NEWNET 隔离network
User Namespace CLONE_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)
相关推荐
极客先躯1 小时前
高级java每日一道面试题-2026年03月30日-实战篇[Docker]-如何监控容器的网络流量?
java·运维·docker·容器·prometheus·高级面试
大E帝国子民13 小时前
Docker 部署 RocketMQ 5
docker·容器·rocketmq
江湖有缘4 小时前
【保姆级教程】使用Docker Compose一键搭建Picsur私有图床服务
java·docker·容器
java_logo7 小时前
5 分钟共享打印机:用 Docker 一键部署 CUPS
运维·docker·容器·cups·网络打印机·共享打印机·docker部署cups
fen_fen7 小时前
Docker部署PostgreSQL10 开启SSL和证书安装文档
docker·容器·ssl
EnCi Zheng9 小时前
N3A-一个端口只能给一个程序使用吗?[特殊字符]
网络·nginx·docker
彼岸笙箫9 小时前
Centos7离线安装docker
运维·docker·容器
nuo53420210 小时前
基础 1 —— Docker 的简介
运维·docker·容器
承渊政道10 小时前
OneNav书签导航实操:极空间Docker部署、分类整理与公网访问
运维·docker·内网穿透·cpolar·nas·onenav·轻量级部署
oioihoii12 小时前
CentOS运行Teemii实操:Docker Compose部署、漫画导入与公网阅读
linux·docker·centos