docker 是什么
docker 是一个容器,隔离当前的环境和实体机环境
docker 如何简单实现
docker 分别使用namespaces cgroups layered filesystems 等技术来实现简单的
namespaces
大多数容器技术将用户的进程放入上述所有命名空间中,并初始化命名空间以提供标准环境。
cgroups
Cgroups(Control Groups)是 Linux 内核提供的一种关键机制,用于限制、记录和隔离进程组(process groups)所使用的系统资源
限制docker能使用的计算机资源
layered filesystems
分层文件系统是我们高效移动整个机器映像的方式,可以实现镜像和容器的高效管理
以上代码来自
这篇文章
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| package main
import ( "fmt" "os" "os/exec" "syscall" )
func main() { switch os.Args[1] { case "run": parent() case "child": child() default: panic("wat should I do") } }
func parent() { cmd := exec.Command("/proc/self/exe", append([]string{"child"}, os.Args[2:]...)...) cmd.SysProcAttr = &syscall.SysProcAttr{ Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS, } cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil { fmt.Println("ERROR", err) os.Exit(1) } }
func child() { must(syscall.Mount("rootfs", "rootfs", "", syscall.MS_BIND, "")) must(os.MkdirAll("rootfs/oldrootfs", 0700)) must(syscall.PivotRoot("rootfs", "rootfs/oldrootfs")) must(os.Chdir("/"))
cmd := exec.Command(os.Args[2], os.Args[3:]...) cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil { fmt.Println("ERROR", err) os.Exit(1) } }
func must(err error) { if err != nil { panic(err) } }
|
我的仓库