自己动手写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)
相关推荐
掉头发的王富贵29 分钟前
Dockerfile不会写?于是我花十分钟看了这篇文章
后端·docker·容器
IT闫2 小时前
【AI】——结合Ollama、Open WebUI和Docker本地部署可视化AI大语言模型
docker·语言模型·容器
梁萌2 小时前
06-DevOps-自动构建Docker镜像
运维·docker·devops
pingzhuyan9 小时前
03(总)-docker篇 Dockerfile镜像制作(jdk,jar)与jar包制作成docker容器方式
java·docker·jar
Bl_a_ck10 小时前
【C++】Docker介绍
运维·docker·容器·eureka
keepython12 小时前
【n8n docker 部署的代理问题】解决n8n部署无法访问openai等外国大模型厂商的api
运维·人工智能·docker·容器
八股文领域大手子12 小时前
优化IDEA2024.3大型项目启动慢
运维·nginx·spring·docker·容器
深夜面包15 小时前
Ubuntu 安装与配置 Docker
linux·ubuntu·docker
斯普信专业组17 小时前
二进制和docker两种方式部署Apache pulsar(standalone)
docker·容器·apache
Michaelwubo17 小时前
docker 支持GPU 问题 安装 NVIDIA Docker
docker·容器·eureka