> For the complete documentation index, see [llms.txt](https://3100563328.gitbook.io/docker/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://3100563328.gitbook.io/docker/master.md).

# 实验一

## **UTS Namespace**

UTS Namespace 主要用来隔离 nodename 和 domainname 两个系统标识。在 UTS Namespace里面 , 每个 Namespace 允许有自己的 hostname 。

![image-20210420220653310](https://gitee.com/bokket/Picgo/raw/master/image-20210420220653310.png)

![image-20210420220733452](https://gitee.com/bokket/Picgo/raw/master/image-20210420220733452.png)

新开终端

![image-20210420220827264](https://gitee.com/bokket/Picgo/raw/master/image-20210420220827264.png)

外部的 hostname 井没有被内部的修改所影响

## **IPC Namespace**

IPC Namespace 用来隔离 System V IPC 和 POSIX message queues 每 一个 IPC Namespace都有自己的 System V IPC 和 POSIX message queue

```
ipcs - q
ipcmk -Q
ipcs -q 
```

![image-20210420231052469](https://gitee.com/bokket/Picgo/raw/master/image-20210420231052469.png)

再开一个终端

![image-20210420231229661](https://gitee.com/bokket/Picgo/raw/master/image-20210420231229661.png)

可以看到已经被隔离

## **PID Namespace**

![image-20210420232434782](https://gitee.com/bokket/Picgo/raw/master/image-20210420232434782.png)

![image-20210420232448598](https://gitee.com/bokket/Picgo/raw/master/image-20210420232448598.png)

10102 PID被映射到Namespace里后PID为1

## **Mount Namespace**

```
ls /proc
mount -t proc proc /proc
```

##

![image-20210420233702704](https://gitee.com/bokket/Picgo/raw/master/image-20210420233702704.png)

![image-20210420233750170](https://gitee.com/bokket/Picgo/raw/master/image-20210420233750170.png)

## **User Namespace**

这里有个坑

```
cmd.SysProcAttr.Credential = &syscall.Credential{
   Uid: uint32(1),
   Gid: uint32(1),
}
```

这个Linux kernel在3.19以上的版本中对`user namespace`做了修改

我的版本是`5.4.0-72-generic`,必须把它去掉才能过

详细见 iusse

<https://github.com/xianlubird/mydocker/issues/3>

![image-20210421004047856](https://gitee.com/bokket/Picgo/raw/master/image-20210421004047856.png)

![image-20210421003955591](https://gitee.com/bokket/Picgo/raw/master/image-20210421003955591.png)

![image-20210421004129429](https://gitee.com/bokket/Picgo/raw/master/image-20210421004129429.png)

## **Network Namespace**

![image-20210421011115425](https://gitee.com/bokket/Picgo/raw/master/image-20210421011115425.png)

![image-20210421011049760](https://gitee.com/bokket/Picgo/raw/master/image-20210421011049760.png)

在 Namespace 里面什么网络设备都没有

第一次实验完成了，这本书的实验环境又老又不太好，感觉下面还有一堆坑。。

## **Linux Cgroups**

Cgroups有3 个组件

* cgroup 是对进程分组管理的一种机制, 一个 cgroup 包含一 组进程,井可以在这个 cgroup上增加 Linux subsystem 的各种参数配置

  一组进程关联一组subsystem 的系统参数

* subsystem 是一组资源控制的模块

  ```
  lssubsys -a 查看内核支持的subsystem
  ```

  ![image-20210421124752290](https://gitee.com/bokket/Picgo/raw/master/image-20210421124752290.png)

* hierarchy的功能是把一组cgroup串成一个树状的结构,一个这样的树便是 一个hierarchy ,通过这种树状结构, Cgroups 可以做到继承

* 内核配置Cgroups

```
mkdir cgroup-test
sudo mount -t cgroup -o none,name=cgroup-test cgroup-test ./cgroup-test
ls ./cgroup-test 
```

![image-20210421130112050](https://gitee.com/bokket/Picgo/raw/master/image-20210421130112050.png)

&#x20;cgroup 的目录下创建文件夹时, 内核会把文件夹标记为这个 cgroup的子 cgroup ,它们会继承父 cgroup 的属性

* 在 cgroup 中添加和移动进程

```
 sudo sh -c "echo $$ >> tasks"
```

![image-20210421131354475](https://gitee.com/bokket/Picgo/raw/master/image-20210421131354475.png)

![image-20210421131450148](https://gitee.com/bokket/Picgo/raw/master/image-20210421131450148.png)

* 通过 subsystem 限制 cgroup 中进程的资源

  有点坑，要去/sys/fs/cgroup/memory才能看到现象

  先开一个stress进程

```
 stress --vm-bytes 200m --vm-keep -m 1
```

![image-20210421134942607](https://gitee.com/bokket/Picgo/raw/master/image-20210421134942607.png)

![image-20210421135216126](https://gitee.com/bokket/Picgo/raw/master/image-20210421135216126.png)

有一个占用内存2.6%的

再做限制cgroup最大内存为100mb

```
sudo mkdir test-limit-memory && cd test-limit-memory
sudo sh -c "echo "100m" > memory.limit_in_bytes"
sudo sh -c "echo $$ > tasks"
stress --vm-bytes 200m --vm-keep -m 1
```

![image-20210421135413991](https://gitee.com/bokket/Picgo/raw/master/image-20210421135413991.png)

通过 cgroup ,我们成功地将 stress 进程的最大内存占用限制到了100MB
