命名空间Go实现 - UTS

在上篇文章我们配置了Network命名空间并且为container提供了一个可以访问的IP地址。现在container可以加入网络了,如果能设置一个主机名就更好了。在本文,我们将配置UTS命名空间。

我们先看看当前的行为。

# Git repo: https://github.com/bingbig/container
# Git tag: 5.0
# Filename: container.go
liub@HiBing➜container git:(master)hostname
HiBing
liub@HiBing➜container git:(master) ✗ ./container run /bin/sh

>> namespace setup code goes here <<

host-[container]- # hostname
HiBing
1
2
3
4
5
6
7
8
9
10
11

我们可以看到新的命名空间里面的主机名和宿主机的相同。幸运的是这个很好解决。

Let‘s Go

在Go中,主机名可以i通过syscall.SetHostName来设置。

















 
 
 
 









# Git repo: https://github.com/bingbig/container
# Git tag: 6.0
# Filename: container.go
func nsInitialisation() {
	newrootPath := os.Args[1]

	if err := mountProc(newrootPath); err != nil {
		fmt.Printf("Error mounting /proc - %s\n", err)
		os.Exit(1)
	}

	if err := pivotRoot(newrootPath); err != nil {
		fmt.Printf("Error running pivot_root - %s\n", err)
		os.Exit(1)
	}

	if err := syscall.Sethostname([]byte("container")); err != nil {
		fmt.Printf("Error setting hostname - %s\n", err)
		os.Exit(1)
	}

	if err := waitForNetwork(); err != nil {
		fmt.Printf("Error waiting for network - %s\n", err)
		os.Exit(1)
	}

	nsRun()
}
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

主机名已经写死在代码里了。大多数的容器实现都是把主机名设置成ID或者容器名,默认情况下通常是随机UUID值。

就这些了!我们来确认以下我们的实现是不是如我们期望的。

# Git repo: https://github.com/bingbig/container
# Git tag: 6.0
# Filename: container.go
liub@HiBing➜container git:(master) ✗ ./container run /bin/sh

>> namespace setup code goes here <<

-[container]- # hostname
container
-[container]- # exit
liub@HiBing➜container git:(master)hostname
HiBing
1
2
3
4
5
6
7
8
9
10
11
12

完美!

接下来

如何限制容器使用的系统资源呢?

最近更新: 2/24/2020, 2:54:06 PM