自己动手写docker
<<自己动手写docker>>阅读实践笔记
docker理论基础这部分不再赘述,可以看我这篇文章一文带你全方位入门docker。
此次实践使用的IDE为Goland,操作系统为mac,代码运行环境为Cent OS7,内核版本为3.10.0-957.21.3.el7.x86_64
开始前,需要修改Goland,Preferences–>Go–>OS改为linux,内核版本为。否则代码编写时一些linux only的系统调用会报错。
https://golang.org/pkg/syscall/#SysProcAttr
1. 实现六个namespace隔离
1.1. 实现UTS namespace隔离
通过syscall.CLONE_NEWUTS
创建一个新的UTS namespace
package main
import (
"log"
"os"
"os/exec"
"syscall"
)
func main() {
cmd := exec.Command("sh")
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)
}
}
在centos上运行此代码go run 1.uts_ns.go
进入一个交互式的环境
通过pstree -pl
查询进程树
$ pstree -pl | grep go
|-sshd(21453)---sshd(27698)---bash(27701)---go(16497)-+-1.uts_ns(16514)-+-sh(16517)-+-grep(16564)
这时去查询父进程和子进程的UTS namespace
sh-4.2# ls /proc/16514/ns/uts -al
lrwxrwxrwx 1 root root 0 7月 6 13:41 /proc/16514/ns/uts -> uts:[4026531838]
sh-4.2# ls /proc/16517/ns/uts -al
lrwxrwxrwx 1 root root 0 7月 6 13:41 /proc/16517/ns/uts -> uts:[4026532283]
可以看到不在同一个UTS namespace中,UTS namespace主要用来隔离主机名和域名,现在我们来修改主机名进行验证。
sh-4.2# hostname newuts
sh-4.2# hostname
newuts