在了解底层原理之前:

说几个名词:

解耦状态: 所有东西都没有重复,任何东西都没有公用的地方。

半解耦状态:有部分共同的一起用,其他的独立

完全解耦状态: 就是各自都是独立没有重复。

kvm:完全解耦

docker:半解耦

#下面通过一张图片,来解释解耦与半解耦的区别:

通过部署nginx来说明:

完全解耦:

比如kvm,VMware就属于完全解耦,流程:硬件层肯定使用宿主机,虚拟内核,虚拟系统,虚拟lib库,虚拟驱动程序,在这基础上进行部署nginx;

半解耦:

docker:docker部署nginx流程:先说明,容器存在的方式,是以文件夹方式存在的,容器去部署nginx,通过软链接,链接到宿主机的内核、OS、lib库、驱动程序,让系统以为这个文件夹是一个独立的系统,在此基础进行部署nginx;

#上述我们知道docker是半解耦,解耦了那些方面?

说之前了解2个目录:

/proc:

/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

/sys:

docker的6项隔离:

namespace(名称空间)

通过linux内核实现的一个技术,实现容器与容器,容器与宿主机之间的隔离;

IPC 共享内存、消息队列
MNT 挂载点
NET 网络栈
PID 服务进程编号
USER   用户、组
UTS 主机名、域

cgroup(控制组)

同样也是通过linux内核实现的一种技术,限制docker容器资源的方式!

[root@lin cgroup]# ls
blkio cpu,cpuacct freezer net_cls perf_event
cpu cpuset hugetlb net_cls,net_prio pids
cpuacct devices memory net_prio systemd
[root@lin cgroup]# pwd
/sys/fs/cgroup

四大功能:

1、资源限制

cgroups可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出OOM(OutofMemory)。

2、优先级分配

通过分配的CPU时间片数量及硬盘IO带宽大小,实际上就相当于控制了进程运行的优先级。

3、资源统计

cgroups可以统计系统的资源使用量,如CPU使用时长、内存用量等等,这个功能非常适用于计费。

4、进程控制

cgroups可以对进程组执行挂起、恢复等操作。

#对内存的300MB和swap的限制300MB。

  1. 1 [root@lin /]# docker run -itd --name a1 -m 300M --memory-swap 300M busybox:latest
  2. 2 Unable to find image 'busybox:latest' locally
  3. 3 latest: Pulling from library/busybox
  4. 4 e5d9363303dd: Pull complete
  5. 5 Digest: sha256:c5439d7db88ab5423999530349d327b04279ad3161d7596d2126dfb5b02bfd1f
  6. 6 Status: Downloaded newer image for busybox:latest
  7. 7 49eb02aa8194b3d788bb0f98bca1b09ee38c68efecf04406ee341ed03a70b115
  8. 8 #查看限制
  9. 9 [root@lin /]# cd /sys/fs/cgroup/memory/docker/49eb02aa8194b3d788bb0f98bca1b09ee38c68efecf04406ee341ed03a70b115/
  10. 10 [root@lin 49eb02aa8194b3d788bb0f98bca1b09ee38c68efecf04406ee341ed03a70b115]# cat memory.limit_in_bytes
  11. 11 314572800 #查看mem
  12. 12 [root@lin 49eb02aa8194b3d788bb0f98bca1b09ee38c68efecf04406ee341ed03a70b115]# cat memory.memsw.limit_in_bytes
  13. 13 314572800 #查看swap
  14. 14 ps:创建swap的时候要注意数值位只是是内存的1

##对CPU的权重限制,cpu-shares 512

  1. 1 [root@lin docker]# docker run -itd --name a2 -c 512 busybox:latest
  2. 2 adebf96dc88a1b26a2d8cf3a23f93c9950f0c9f6d2c3eb10892c35bf5290e73f
  3. 3 [root@lin adebf96dc88a1b26a2d8cf3a23f93c9950f0c9f6d2c3eb10892c35bf5290e73f]# cat cpu.shares
  4. 4 512 #等于512
  5. 5 [root@lin adebf96dc88a1b26a2d8cf3a23f93c9950f0c9f6d2c3eb10892c35bf5290e73f]# pwd
  6. 6 /sys/fs/cgroup/cpu/docker/adebf96dc88a1b26a2d8cf3a23f93c9950f0c9f6d2c3eb10892c35bf5290e73f2c3eb10892c35bf5290e73f/
  7. 8 ps:默认情况下,每个docker容器的cpu份额都是1024。单独一个容器的份额是没有意义的,只有在同时运行多个容器时,容器的cpu加权的效果才能体现出来。例如,两个容器ABcpu份额分别为1000500,在cpu进行时间片分配的时候,容器A比容器B多一倍的机会获得CPU的时间片。

##实现block io的限制

io分为磁盘io和带宽io。

默认情况下,所有容器能平等地读写磁盘,可以通过设置–blkio-weight参数来改变容器Block IO的优先级

–blkio-weight与–cpu-shares类似,设置的是相对权重值,默认为600

  1. 1 设置容器A的磁盘读写权重为600
  2. 2
  3. 3 [root@lin /]# docker run -itd --name a3 --blkio-weight 600 busybox:latest 76377305213db266a1f773d115db3dbebef7a34acd31d5ad81a764b2a24f24c5
  4. 4 [root@lin /]# docker exec -it a3 sh
  5. 5[root@lin /]# cat /sys/fs/cgroup/blkio/blkio.weight
      600

#bps和iops的限制

bps是每秒读写的数据量

iops是每秒io的次数

可通过以下的参数控制容器的bps和iops

  • –device-read-bps:限制读某个设备的bps

  • –device-write-bps:限制写某个设备的bps

  • –device-read-iops:限制读某个设备的iops

  • –device-write-iops:限制写某个设备的iops

  1. 举例:将容器的sda系统盘的读写速率设置为50MB/s
  2. [root@lin /]# docker run -it --name dps --device-write-bps /dev/sda:50MB centos:7 sh
  3. sh-4.2# time dd if=/dev/zero of=test bs=1M count=800 oflag=direct
  4. 800+0 records in
  5. 800+0 records out
  6. 838860800 bytes (839 MB) copied, 15.9181 s, 52.7 MB/s #50MB左右
  7.  
  8. real 0m15.920s
  9. user 0m0.000s
  10. sys 0m0.514s

  

 

docker的底层-隔离的核心的更多相关文章

  1. Docker 基础底层架构浅谈

    docker学习过程中,免不了需要学习下docker的底层技术,今天我们来记录下docker的底层架构吧! 从上图我们可以看到,docker依赖于linux内核的三个基本技术:namespaces.C ...

  2. Docker 容器的隔离性

    Docker 容器的隔离性 就是 使用Linux namespace 来隔离运行环境和成 cgroup 限制容器使用的资源.  namespace 可以顾名思义 命名空间:所以可以理解为每个独立的容器 ...

  3. Docker技术底层架构剖析

    [Docker  底层技术] docker底层的 2 个核心技术分别是 Namespaces 和 Control groups 在操作系统中,网络配置,进程,用户,IPC(进程之间的调用)等信息之间的 ...

  4. 6.Docker容器底层实现了解与安全机制

    原文地址: 点击直达 0x00 底层实现 我们以 Docker 基础架构来探究Docke底层的核心技术,简单的包括: Linux 上的命名空间(Namespaces) 控制组(Control grou ...

  5. [Docker]容器的隔离与限制

    1.Docker事实 1)容器技术的兴起源于Pass技术的普及 2)Docker公司发布的Docker项目具有里程碑式的意义 3)Docker项目通过容器镜像解决了应用打包这个根本性难题 4)容器本身 ...

  6. Docker Swarm Mode简介与核心概念

    什么是Docker Swarm Docker Swarm是Docker官方的一种容器编排方案,用于管理跨主机的Docker容器,可以快速对指定服务进行水平扩展.部署.删除 一个Docker Swarm ...

  7. Docker 容器资源隔离 namespace(十)

    目录 一.简介 Linux Namespace的6大类型 二.Mount Namespace 三.IPC Namespace 四.Network Namespace 五.UTS Namespace 六 ...

  8. 小D课堂 - 新版本微服务springcloud+Docker教程_2_02 微服务核心基础讲解

    笔记 2.微服务核心基础讲解     简介:讲解微服务核心知识 :网关.服务发现注册.配置中心.链路追踪.负载均衡器.熔断         1.网关:路由转发 + 过滤器                ...

  9. docker基本底层原理

    docker是怎么工作的 Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket客户端进行访问 DockerServer接收到DockerClie ...

随机推荐

  1. ios获取缓存文件的大小并清除缓存

    移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...

  2. CTS相关的几个表

    TMSALOG/TMSALOGAR :STMS传输日志表 TMSCNFS:传输组 TMSCDOM:传输域 TMSCDES:传输目的地 TMSBUFTXT:传输请求的短文本和用户 TMSCSYS:tms ...

  3. Vue项目之实现登录功能的表单验证!

    Vue项目之实现登录功能的表单验证! 步骤: 配置 Form表单验证; 1.必须给el-from组件绑定model 为表单数据对象 2 给需要验证的表单项 el-form-item 绑定 prop 属 ...

  4. jemeter断言和性能分析

    一.添加断言 1.原因:检查是否有该结果,一般一个请求过去除了400和500的只要通过的都会代表请求成功,比如登录页面及时填写了错误密码,虽然会返回密码错误,但这个请求还是成功的,所以我们要添加断言, ...

  5. Python 代码的加密混淆

    py 脚本编译成 c 文件(cython) 用 cython 将核心代码 py 模块文件转化成 .c 文件,再用 gcc 编译成 so(unix)文件,或者将其编译成 pyd(windows)文件. ...

  6. Nagle's algorithm 封包 网络游戏协议封包需注意点 封包挂

    w41字节的数据包只有1字节的可用信息.以减少数据包发送量来提高TCP/IP网络性能. https://en.wikipedia.org/wiki/Nagle's_algorithm https:// ...

  7.  Go is more about software engineering than programming language research.

    https://talks.golang.org/2012/splash.article Go at Google: Language Design in the Service of Softwar ...

  8. Kali-2020 配置Docker

    Kali 2020 安装Docke 为什么在Kali上安装Docker? Kali有很多工具,但是您想运行一个不包含的工具,最干净的方法是通过Docker容器.例如,我正在研究一个名为vulhub的靶 ...

  9. 搭建Spring相关框架后,配置信息文件头部出现红色小×错误。

    问题描述: 在搭建关于Spring相关框架的时候,在applicationContext.xml配置文件和servlet-mvc.xml配件文件的头部会出现一个红色的小X错误: 错误描述: Refer ...

  10. MapReduce编程练习(三),按要求不同文件名输出结果

    问题:按要求文件名输出结果,比如这里我要求对一个输入文件中的WARN,INFO,ERROR,的信息项进行分析,并分别输入到对应的以WARN,INFO.ERROR和OTHER开头的结果文件中,其中结果文 ...