自己动手写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)
相关推荐
“码”力全开5 分钟前
解耦异构算力:基于 Docker 与边缘计算的 GB28181/RTSP 企业级 AI 视频管理平台架构设计(含源码交付)
人工智能·docker·边缘计算
dabidai6 分钟前
Docker PostgreSQL Windows 权限问题总结
windows·docker·postgresql
ai产品老杨40 分钟前
架构师视界:基于 Docker 容器化与边缘计算的 AI 视频管理平台——打通 GB28181/RTSP 异构集群与源码交付实战
人工智能·docker·边缘计算
随便做点啥42 分钟前
8×910B4-32G NPU服务器 vLLM-Ascend部署Docker安装报告
服务器·docker·vllm
川石课堂软件测试1 小时前
UI自动化测试|下拉选择框&弹出框&滚动条操作实践
开发语言·python·jmeter·ui·docker·单元测试·harmonyos
“码”力全开1 小时前
统一解耦海量设备:基于 Docker 与边缘计算的 GB28181/RTSP 视频中台全协议兼容架构解析(附源码交付)
docker·音视频·边缘计算
liux35281 小时前
Namespace 多租户隔离:K8s 资源管理的基石
docker·容器·kubernetes
程序员酥皮蛋11 小时前
docker基础
docker·容器·eureka
java知路14 小时前
linux yum 下载docker安装包及依赖安装包,并离线安装
linux·运维·docker
没有退路那我就不要散步14 小时前
kube-proxy优化
docker·容器·kubernetes