docker02-原理-隔离的核心

在了解底层原理之前:

说几个名词:

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

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

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

 

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

 

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

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

 

##实现block io的限制

io分为磁盘io和带宽io。

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

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

1 设置容器A的磁盘读写权重为600
2 
3 [root@lin /]# docker run -itd --name  a3 --blkio-weight 600 busybox:latest 76377305213db266a1f773d115db3dbebef7a34acd31d5ad81a764b2a24f24c5
4 [root@lin /]# docker exec  -it a3 sh
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

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

real	0m15.920s
user	0m0.000s
sys	0m0.514s

  

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


最近一直在开发Apworks框架的案例代码,同时也在一起修复Apworks框架中的Bug和一些设计上的不足。遇到的一个普遍问题是,代码的调试过程需要依赖很多外部系统,比如MongoDB、PostgreSQL、RabbitMQ等。当然可以在本机逐一安装这些服务,然后对服务进行配置,使其满足自己开发调试
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。在文本发布和处理微服务中,我打算使用微软的SQL Server for Linux来做演示,于是也就在自己的docker-compose中加入了MS SQL Server的服务。其实在Docker中运行SQL Server是非常容
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程,这里介绍如何在部署于Kubernetes的ASP.NET Core MVC的应用程序中使用Rook-Ceph所创建的存储对象。 构建ASP.NET C
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也抽空多了解了一些。项目主要基于Rook-Ceph运行,考虑到Rook-Ceph部署也不那么简单,官方文档的步骤起点也不算低,因此,在整合官方文档的某些步骤的基础上,写篇文章简单总结一下。 Rook-Ceph是Kubernetes中分布
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
构建镜像最具挑战性的一点是使镜像大小尽可能的小。Dockerfile中的每条指令都为图像添加了一个图层,您需要记住在移动到下一层之前清理任何不需要的工件。对于多阶段构建,您可以在Dockerfile中使用多个FROM语句。每个FROM指令可以使用不同的基础,并且每个指令都开始一个新的构建。您可以选择
本文介绍compose配置文件参数的使用,熟练编写compose文件 [root@docker lnmp]# cat lnmp.yaml version: '3' services: nginx: build: /root/docker_demo/nginx/ ports: - &q
环境 docker-machine主机:192.168.1.9 docker主机:192.168.1.10 步骤: 安装docker-machine 创建ssh密钥对,实现两主机无密登录 创建docker主机,命名host1 变更docker环境变量 运行容器查看两端是否同步 镜像容器同步测试成功
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
https://blog.csdn.net/wanglei_storage/article/details/77508620 实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行。然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容
1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题。 2. Why Need Nginx .NET Core中默认的Web Server为Kestrel。 Kestrel is grea
docker rm `docker ps -a | grep Exited | awk '{print $1}'` 删除异常停止的docker容器 docker rmi -f `docker images | grep '<none>' | awk &#3
什么是Docker Compose 在微服务盛行的今天,我们通常是这么定义Compose的:对容器的统一启动和关闭的编排工具。 但是我以前还是有个疑惑,谁会用Compose在一台服务器上部署多个服务呢?干脆直接用单体服务就行了!直到我遇到了以下的一个需求,让我明白了在一台服务器上不得不用多个服务的时
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
很多时候,我们在本地开发过程中程序运行很正常,但是发布到线上之后由于环境的原因,可能会有一些异常。通常我们会通过日志来分析问题,除了日志还有一种常用的调试手段就是:附加进程。 VS中的附加进程非常强大,目前提供了9种常用的附加方式。 在当前.Net Core支持跨平台的大背景下,其中Linux环境和
https://www.cnblogs.com/bigberg/p/8867326.html 一、简介 Docker有个编排工具docker-compose,可以将组成某个应该的多个docker容器编排在一起,同时管理。同样在Swarm集群中,可以使用docker stack 将一组相关联的服务进行
.Net6中想实现对某个网址截屏,可通过Selenium模拟访问网址并实现截图。 实现 安装Nuget包 <PackageReference Include="Selenium.Chrome.WebDriver" Version="85.0.0" /&g
原文 https://www.cnblogs.com/gispathfinder/p/5871043.html 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host指定。 co