cgroup和namespace是实现容器底层的重要技术

cgroup:实现资源限制

namespace:实现资源隔离

1.cgroup:control group

Linux操作系统通过cgroup可以设置进程使用CPU,内存和IO资源使用的限额。我们之前学习的通过-m,--memory-swap,-c,--blkio-weight就是通过cgroup实现的。那么cgroup到底是什么样子的呢?

可以在/sys/fs/cgroup里面找到,例如:

我们运行一个容器,我们设置的cpu的权重是700

我们进入/sys/fs/cgroup/cpu/docker目录下的相应的容器的ID的目录里面,看cpu.shares,可以看到我们设置的权重是700

同样的我们进入/sys/fs/cgroup/memory/docker/中大概是memory.limit_in_bytes这个文件是容器内存的大小

同样的我们进入/sys/fs/cgroup/blkio/docker/中,blkio.weight这个文件是Block IO的权重文件

我们可以在以上的文件中,查看或者更改容器资源的大小

2.namespace

            我们运行的每一个容器,都像是一个新的操作系统一样,都有文件系统,网卡等资源;那网卡来说,每个容器都会认为自己有一块独立的网卡,即使Host主机实际只有一块网卡资源,这样的方式使容器更像是一个独立的计算机。

namespace管着Host中全局唯一的资源,并让每个容器都觉得只有自己在使用它,namespace实现了容器间的资源隔离

Linux使用了6种namespace:Mount,UTS,IPC,PID,Network

一。Mount namspace:让容器看上去拥有整个文件系统

容器有自己的 / 目录,可执行mount和umount命令。这些操作只对当前的容器生效,不会影响到host和其他容器    

对于mount namespace的实验可以参考:https://segmentfault.com/a/1190000006912742

二。UTS namespace:让容器有自己的hostname

默认情况下容器的hostname是他的   短ID ,可以通过  -h或者--hostname来设置容器的主机名

三。IPC namespace:让容器有自己的共享内存和信号量(semaphore)

让容器有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与host以及其他容器的ipc混在一起

四。PID namespace:让容器有自己独立的PID进程

我们知道,容器在host中以进程的形式运行,例如:

docker ps可以看到运行了几个容器

我们通过   ps axf可以看到容器的进程:第一列为容器的PID号

可以看到所有容器的进程都挂在了dockerd进程下,同事可以看到容器的自己的子进程,但是如果我们进入到某个容器里面,ps后只能看到自己的进程了

例如:

从这里可以看到容器的PID不同于Host上面对应的PID,容器中PID=1的进程当然也不是host的init进程。这也就证明了容器有自己的一套独立的PID进程

五:Network namespace:让容器有自己独立 的网络资源

Network namespace让容器有自己独立的网卡 ,IP,路由等资源。

六。User namespace :让容器能够管理自己的用户,Host不能看到容器中创建的用户

当我们返回到Hostname上面的时候,切换到同样的用户,可以看到

在容器中创建的用户在host中并不存在

centos7下安装docker(10容器底层--cgroup和namespace)的更多相关文章

  1. docker(一) Centos7下安装docker

    docker(一) Centos7下安装dockerdocker(二) windows10下安装dockerdocker(三) 镜像和容器常用命令 docker(四) 使用Dockerfile构建镜像 ...

  2. CentOS7下安装docker(Docker系列1)

    CentOS7下安装docker 系统要求 为了安装docker,需要准备 64-bit的CentOS 7 删除非官方的Docker包 yum的仓库中有一个很旧的Docker包, 现在Docker官方 ...

  3. centos7下安装docker与镜像加速

    1.背景 centos7下安装docker 2.安装 第一步:检查是否为centos7版本 第二步:依赖环境安装 执行如下两个命令: yum -y install gcc yum -y install ...

  4. centos7 下安装docker报错:You could try using...

    搞了台VPS,想要装docker,发现死活装不上,各种报错.之前系统是centos6,发现官方现在已经不支持centos6了,遂升级到centos7,然后还是出现下面这个错误. Error: Pack ...

  5. centos7下安装docker(19容器架构)

    What,Why,How What:什么是容器? 说起容器大家想到的是什么?      集装箱(container),虚拟机,docker,k8s 1. 没毛病,因为容器与集装箱的英文都可以翻译成co ...

  6. centos7下安装docker(11容器操作总结)

    这段时间主要是学习了对容器的操作,包括:容器的状态:start,stop,restart,rename,pause,unpause,rm,attach,exec,kill,logs:还学习了对容器的资 ...

  7. centos7下安装docker(13.4容器volume总结)

    最近我们学习了docker 存储,首先docker存储有两种:storage driver和data volume. storage driver是由镜像层和容器层组成的,可以通过docker ins ...

  8. centos7下安装docker(12.4容器如何与外部进行通信)

    1.容器如何访问外部 前面我们做了很多试验:只要host能连外网,使用默认bridge(docker0)创建得容器就能访问外网,那么容器是怎样访问外网的呢? 注:这里的外网不仅是internet,包括 ...

  9. centos7下安装docker(8.3容器的常用操作)

    yu我们之前已经学习了如何运行容器docker run,也学习了如何进入容器docker attach和docker exec,下面我们来学习容器的其他操作: stop/start/restart 1 ...

随机推荐

  1. [CF438E] 小朋友和二叉树

    Description 给定一个整数集合 \(c\),对于每个 \(i\in[1,m]\),求有多少种不同的带点权的二叉树使得这棵树点权和为 \(i\) 并且顶点的点权全部在集合 \(c\) 中.\( ...

  2. IdentityServer4 中文文档 -4- (简介)打包和构建

    IdentityServer4 中文文档 -4- (简介)打包和构建 原文:http://docs.identityserver.io/en/release/intro/packaging.html ...

  3. 如何利用Maven Repository下载开源软件jar包

    1.打开Maven Repository 网站:https://mvnrepository.com/ 2.输入需要寻找的jar包名称,比如mybatis,点击search,一般第一个就是 3.点击选择 ...

  4. Ado.net和EF的区别

    ado.net EF作为微软的一个ORM框架,通过实体.关系型数据库表之间的映射,使开发人员可以通过操作表实体而间接的操作数据库,大大的提高了开发效率.这样一来,.net平台下,我们与底层数据库的交互 ...

  5. JAVA的高并发基础认知 一

    一.多线程的基本知识 1.1进程与线程的介绍 程序运行时在内存中分配自己独立的运行空间,就是进程 线程:它是位于进程中,负责当前进程中的某个具备独立运行资格的空间. 进程是负责整个程序的运行,而线程是 ...

  6. php面向对象的接口和APP接口区别

    以下是php面向对象的接口:

  7. 关于html5中的 网页图标问题

    在html5 中 设置网页图标的语句<link rel="icon" type="image/x-icon" href="favicon.ico ...

  8. Jetbrains IDE 中 compass sass 设置

    环境 Ubuntu 13.10 1. 安装ruby sudo apt-get install ruby 如果后面安装 compass 时遇到安装失败,提示:“[Ubuntu] ERROR: Faile ...

  9. BZOJ4259: 残缺的字符串(FFT 字符串匹配)

    题意 题目链接 Sol 知道FFT能做字符串匹配的话这就是个裸题了吧.. 考虑把B翻转过来,如果\(\sum_{k = 0}^M (B_{i - k} - A_k)^2 * B_{i-k}*A_k = ...

  10. 为什么radio没有出现单选效果?

    原因是radio一定要设置相同的name,如下: <input type="radio" name="yunsuan" checked="che ...