[正在不断更新中...]
Docker是一个使用了Linux Namespace和Cgroups的虚拟化工具
Linux Namespace是Kernel的一个功能,可以隔离一系列系统资源(PID、UID、Network),帮助进程隔离出自己的单独的空间。
Cgroups限制一组进程及将来子进程的资源的大小,保证不会相互争抢,这些资源包括CPU、内存、存储、网络等,并进行监控和统计信息。
Namespace
- Namespace类型及系统调用参数:
Namespace类型 系统调用参数
Mount Namespace CLONE_NEWNS
UTS Namespace CLONE_NEWUTS
IPC Namespace CLONE_NEWIPC
PID Namespace CLONE_NEWPID
Network Namespace CLONE_NEWNET
User Namespace CLONE_NEWUSER
Namespace的API主要有三个系统调用:
clone()创建新进程
unshare()将进程移除某个Namespace
setns()将进程加入到某个Namespace
- UTS Namespace
UTS Namespace主要来隔离nodename和domainname两个系统标识。在UTS Namespace里面,每个Namespace有自己的hostname。
Go实现代码:
package main
import (
"log"
"os"
"os/exec"
"syscall"
)
func main(){
cmd := exec.Command("bash")
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags:syscall.CLONE_NEWUTS,
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run();err!=nil{
log.Fatal(err)
}
}
exec.Command("bash")用来制定被fork出来的新进程内的初始命令,默认用bash来执行。












网友评论