上一篇: 【实现简单的容器】- docker基础技术之namespace
本文用简短的一段golang程序来实现六种namespace隔离后的容器。
六种namespace 分别是 :
- syscall.CLONE_NEWUTS 隔离主机名和域名
- syscall.CLONE_NEWIPC 隔离进程间通信
- syscall.CLONE_NEWPID 隔离进程ID
- syscall.CLONE_NEWNS 隔离挂载点和文件系统
- syscall.CLONE_NEWUSER 隔离用户的用户组ID
- syscall.CLONE_NEWNET 隔离网络设备
golang 实现
package main
import (
"fmt"
"os"
"os/exec"
"syscall"
)
func main() {
if len(os.Args) != 3 {
fmt.Println("Usage: go run main.go run /bin/sh")
os.Exit(1)
}
flag := os.Args[1]
command := os.Args[2]
if flag == "run" {
Run(command)
}
// run 命令内部调用 init
if flag == "init" {
Init(command)
}
}
// 进程自己调用自己来创建隔离的进程
// 1. 创建/proc/self/exe init command 命令
// 2. 指定隔离的namespace,设置uid和gid
// 3. 分配伪终端
func Run(co