jck28 - 小柒 - Docker容器隔离和故障注入

一, 容器隔离

1,linux namespace隔离

  • namespace 是 linux 中用来隔离进程的手段。容器就是使用该技术来进行隔离的

  • 当前 Linux一共实现了7 种不同类型的 Namespace
    image

  • 通过 cd /proc/19271(进程id)进入该进程目录的所有文件

    • 在ns目录下可以查看该进程所有的namespace相关的信息
      image

2,docker资源限制cgroups

  • cgroups 是 linux 用来限制进程使用资源的手段。容器也是利用这个技术进行资源的隔离

  • mount -t cgroups 查看当前系统的 cgroups文件

  • 设置ngnix资源为2核512G的命令:docker run --name nginx -d -m 512m --cpus=2 nginx
    image

  • 在对应的设置cpu的文件下的docker目录中,可以看到最新的设置

  • tasks文件可以查所有nginx进程ID

二, 容器的故障注入

  • 使用docker inspect image_name命令查询当前容器的 PID

  • 使用nsenter -t pid -n 切换到容器的网络名称空间(-n 表示网络名称空间)

  • 使用iptables/tc等命令进行故障注入

三,docker 镜像分层设计

  • 每个镜像都是由多个层组成的,每一层都可以复用。(比如dockerfile文件的RUN命令,一个命令就是一层)
    image

  • docker每一层都是有缓存的,多次执行的时候未修改的部分会利用缓存。

  • 编写 docker 时可以利用分层缓存的特点加速镜像开发的过程。

四,docker联合文件系统

  • 联合文件系统(Union File System,Unionfs)是一种分层的轻量级文件系统,它可以把多个目录内容联合挂载到同一目录下,从而形成一个单一的文件系统,这种特性可以让使用者像是使用一个目录一样使用联合文件系统。

  • 联合文件系统是 Docker 镜像和容器的基础,它让Docker 可以把镜像做成分层的结构,从而使得镜像的每一层可以被共享。

  • 联合文件系统只是一个概念,真正实现联合文件系统才是关键,联合文件系统的实现方案有很多,Docker 中最常用的联合文件系统有三种:AUFS、Devicemapper 和 OverlayFS。

    • 视图层:登陆到容器,就是视图层,也是目录联合挂载点
    • 容器层:目录可读可写(然后merge给镜像层)
    • 镜像层:就是目录和文件,拥有只读权限

五,Docker 镜像设计方法

image

  • 镜像分层设计(基础镜像层 - 语言层java,python等 - APP应用层)

  • 优点:节省磁盘空间