USER Namespace

即进程运行在一个新的namespace中,且该namespace中的User ID和Group IDA在该namespace内外可以不同,可以实现在namspace的用户是root但是对应到宿主机并不是root

Cloneflags增加一个syscall.CLONE_NEWUSER即可
从零自制docker-5-【USER Namespace NETWORK Namespace】-LMLPHP

代码

package main

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

func main(){
	cmd:=exec.Command("sh")
	cmd.SysProcAttr=&syscall.SysProcAttr{
		Cloneflags: syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWUTS|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)
	}
}

NETWORK Namespace

Network Namespace 是用来隔离网络设备、 IP 地址端口 等网络械的 Namespace

即进程在namespace中拥有独立的(虚拟的)网络设备。并且。在宿主机上搭建网桥后,就能很方便地实现容器之间的通信,而且不同容器上的应用可以使用相同的端口

Cloneflags增加syscall.CLONE_ NEWNET即可

发现在network namespace的进程没有网络设备(可能默认就是没有,需要相关初始化),宿主机依然存在网络设备
从零自制docker-5-【USER Namespace NETWORK Namespace】-LMLPHP

代码块

package main

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

func main(){
	cmd:=exec.Command("sh")
	cmd.SysProcAttr=&syscall.SysProcAttr{
		Cloneflags: syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWUTS|syscall.CLONE_NEWNS|syscall.CLONE_NEWUSER|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)
	}
}
03-30 16:55