Linux

Docker原理笔记

2019-02-01  本文已影响13人  Dakini_Wind

[正在不断更新中...]
Docker是一个使用了Linux NamespaceCgroups的虚拟化工具
Linux Namespace是Kernel的一个功能,可以隔离一系列系统资源(PIDUIDNetwork),帮助进程隔离出自己的单独的空间。
Cgroups限制一组进程及将来子进程的资源的大小,保证不会相互争抢,这些资源包括CPU、内存、存储、网络等,并进行监控和统计信息。

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

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来执行。

上一篇下一篇

猜你喜欢

热点阅读