Docker原理笔记
2019-02-01 本文已影响13人
Dakini_Wind
[正在不断更新中...]
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来执行。