版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Docker容器技术与应用湖北轻工职业技术学院Docker容器管理项目3项目背景在当今数字化时代,软件开发与部署面临诸多挑战。传统应用部署方式繁琐,环境配置复杂且易出现兼容性问题,导致开发、测试和运维效率低下。随着业务规模的快速扩张,对应用的快速迭代和灵活部署提出了更高要求。“Docker容器管理”旨在解决这些痛点,提升整体开发运维效能。Docker容器管理项目3
容器是Docker的另一个核心概念。对比镜像而言,镜像是静态的只读文件,容器是镜像的一个运行实例,容器带有运行时需要的可写文件层。本项目主要介绍围绕容器这一核心概念的具体操作,包括创建容器、启动容器、终止容器、进入容器内执行操作、删除容器和通过导入/导出容器来实现容器迁移等。项目三:Docker容器管理目录任务3.1、认识Docker容器任务3.2、Docker容器资源控制认识Docker容器回顾1、容器的基本概念、特点和实现原理。2、了解镜像和容器的关系。3、容器的基本操作。知识目标了解控制组(CGroups)的功能。能力目标掌握利用CGoups对资源进行控制的方法。素质目标培养勇于探索、尊重科学的精神。小王编写完Docker容器基础操作手册后,考虑到基础操作手册中只包含对容器的基本操作和维护的内容,为了让同事们更高效地使用容器,小王决定在基础操作手册中添加关于对容器资源控制的内容,并通过实例说明。任务3.2Docker容器资源控制任务要求3.2CGroups的含义
在使用
docker
运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平;大的来说,可能会导致主机和集群资源耗尽,服务完全不可用。docker作为容器的管理者,自然提供了控制容器资源的功能。正如使用内核的namespace来做容器之间的隔离,docker也是通过内核的cgroups来做容器的资源限制;包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。任务3.2Docker容器资源控制相关知识3.2CGroups的含义 CGroups(ControlGroups)是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。可以对CPU、内存和磁盘I/O等资源实现控制,Docker可使用CGroups提供的资源限制功能来完成CPU、内存等部分的资源控制。 CGroups提供了对进程进行分组化管理的功能和接口的基础结构,内存或磁盘I/O的分配控制等具体的资源管理功能是通过对进程进行分组化管理来实现的。这些具体的资源管理功能称为CGroups子系统或控制器。任务3.2Docker容器资源控制相关知识3.2CGroups的功能限制资源使用,比如内存使用上限以及文件系统的缓存限制。CGroups可实现对进程组使用的资源总额的限制。例如,使用memory子系统为进程组设定一个内存使用上限,当进程组使用的内存达到限额后再申请内存时。会触发OOM(OutOfMemory)警告。优先级控制,CPU利用和磁盘IO吞吐。CGrups可实现对进程组的优先级控制。通过分配CPU时间片数量及硬盘i/o、带宽大小可控制进程的优先级。例如,使用CPU子系统为某个进程组分配特定cpushare。任务3.2Docker容器资源控制相关知识3.2CGroups的功能资源统计,主要目的是为了计费。 CGroups可实现对进程组使用的资源数量的记录。例如使用cpuacct子系统可记录某个进程组使用的CPU时间。任务控制,挂起进程,恢复执行进程。 CGroups可实现对进程组的隔离和控制。例如,使用ns子系统对不同的进程线使用不同的namespace,以达到隔离的目的,使用不同的进程组实现各自的进程、网络文件系统挂载空间,也可使用freezer子系统将进程组暂停和恢复。任务3.2Docker容器资源控制相关知识3.2CGroups的特点(1)控制族群控制族群是一组按照某种标准划分的进程。CGroups中的资源控制是以控制族群为单位实现的。一个进程可以加入某个控制族群中,也可以从一个进程细移到另一个控制族群。一个进程组的进程可以使用CGroups以控制族群为单位分配资康并受到CGroups以控制族群为单位设定的限制。任务3.2Docker容器资源控制相关知识3.2CGroups的特点(2)层级控制族群可以组织为hierarchical的形式,即一棵控制族群树。子控制自动继承父节点的特定属性,子控制组还可以有自己特定的属性。(3)子系统一个子系统就是一个资源控制器,如memory子系统是一个内存控的子系统必须附加到一个层级上才能起作用。一个子系统附加到某个层级以后,这个压罢级上的所有控制族群都受到这个子系统的控制。任务3.2Docker容器资源控制相关知识3.2CGroups主要通过以下9大子系统实现(1)blkio:为每个块设备设置I/O限制,如磁盘、光盘和USB等设备。(2)cpu:使用调度程序提供对CPU的cgroup任务访问。(3)cpuacct:自动生成cgroup任务的CPU资源使用报告。(4)cpuset:为cgroup中的任务分配独立CPU(在多核系统中)和内存节点。(5)devices:允许或拒绝cgroup任务访问设备。(6)freezer:暂停和恢复cgroup任务。(7)memory:设置每个cgroup任务使用的内存限制,并自动生成内存资源使用报告(8)net_cls:标记每个网络包以供cgroup任务使用。(9)ns:命名空间子系统。3.2任务3.2Docker容器资源控制相关知识CPU资源配额控制Docker的资源限制和隔离完全基于Linuxcgroups。对CPU资源的限制方式也和cgroups相同。Docker提供的CPU资源限制选项可以在多核系统上限制容器能利用哪些vCPU。而对容器最多能使用的CPU时间有两种限制方式:一是有多个CPU密集型的容器竞争CPU时,设置各个容器能使用的CPU时间相对比例。二是以绝对的方式设置容器在每个调度周期内最多能使用的CPU时间。任务3.2Docker容器资源控制相关知识3.2CPU资源配额控制查看docker容器真实的内存,可以[root@localhost~]#dockerstats2ec93f94157eCONTAINERIDNAMECPU%MEMUSAGE/LIMITMEM%NETI/OBLOCKI/OPIDS2ec93f94157e redhat 0.00%10.96MiB/7.607GiB0.14%2.91kB/0B3.72MB/120kB1任务3.2Docker容器资源控制相关知识3.2CPU资源配额控制dockerrun命令和CPU限制相关的所有选项如下:其中--cpuset-cpus用于设置容器可以使用的vCPU核。-c,--cpu-shares用于设置多个容器竞争CPU时,各个容器相对能分配到的CPU时间比例。--cpu-period和--cpu-quata用于绝对设置容器能使用CPU时间。--cpuset-mems暂用不上,这里不谈。任务3.2Docker容器资源控制相关知识3.2CPU资源配额控制(1)CPU份额控制在创建容器时,利用--cpu-shares参数指定容器所使用的CPU份额值。[root@localhost~]#dockerrun-dit
--cpu-shares100busybox
容器创建完成后,可以在/sys/fs/cgroup/cpu,cpuacct/system.slice/docker-<容器完整ID>.scope目录中查看cpu.shares文件,得到CPU份额配置信息。#cat/sys/fs/cgroup/cpu,cpuacct/system.slice/docker-3aebaaa3b2c50bb0c6b91e40aece4061c078f45756e958b01e76dcee34badb33.scope/cpu.shares100任务3.2Docker容器资源控制相关知识3.2--cpu-shares的值仅仅表示一个弹性的加权值,不能保证可以获得1个VCPU或者多少吉赫兹的CPU资源。
默认情况下,每个Docker容器的CPU份额都是1024。CPU份额只有在同时运行多个容器时才能体现其效果,单个容器的份额是没有意义的。例如,容器A和容器B所占用的CPU份额分别为100和50,表示在CPU进行时间片分配的时候,容器A获得CPU的时间片的机会是容器B的两倍,但分配的结果取决于当时主机和其他容器的运行状态。任务3.2Docker容器资源控制相关知识3.2假设有三个正在运行的容器,这三个容器中的任务都是CPU密集型的。第一个容器的cpu共享权值是1024,其它两个容器的cpu共享权值是512。第一个容器将得到50%的CPU时间,而其它两个容器就只能各得到25%的CPU时间了。如果再添加第四个cpu共享值为1024的容器,每个容器得到的CPU时间将重新计算。第一个容器的CPU时间变为33%,其它容器分得的CPU时间分别为16.5%、16.5%、33%。
必须注意的是,这个比例只有在CPU密集型的任务执行时才有用。在四核的系统上,假设有四个单进程的容器,它们都能各自使用一个核的100%CPU时间,不管它们的cpu共享权值是多少。
在多核系统上,CPU时间权值是在所有CPU核上计算的。即使某个容器的CPU时间限制少于100%,它也能使用各个CPU核的100%时间。任务3.2Docker容器资源控制相关知识3.2CGroups只在容器分配的资源紧缺时,也就是说,在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的CPU份额来确定有多少CPU资源分配给它,资源分配结果取决于同时运行的其他容器的CPU分配和容器中进程的运行情况。任务3.2Docker容器资源控制相关知识3.2例如:利用busybox镜像生成两个容器,设置第二个容器的CPU使用率是第一个容器的两倍。#dockerrun-dit--nametest1--cpu-shares100busyboxe65f0cc12e25dac7775b0ffe573c86ef3ed63a07e43ebf2c59895d7da340911f#dockerrun-dit--nametest2--cpu-shares200busybox433d9aace3ffd1c32d7ab548c37b688b13138cb374b3a4146940acb735817555任务3.2Docker容器资源控制相关知识3.2容器创建完成后,可以在/sys/fs/cgroup/cpu,cpuacct/system.slice/docker-<容器完整ID>.scope目录中查看cpu.shares文件,得到CPU份额配置信息。#cat/sys/fs/cgroup/cpu,cpuacct/system.slice/docker-e65f0cc12e25dac7775b0ffe573c86ef3ed63a07e43ebf2c59895d7da340911f.scope/cpu.shares100#cat/sys/fs/cgroup/cpu,cpuacct/system.slice/docker-433d9aace3ffd1c32d7ab548c37b688b13138cb374b3a4146940acb735817555.scope/cpu.shares200任务3.2Docker容器资源控制相关知识3.2(2)CPU周期控制。--cpu-period和--cpu-quota参数可以控制容器分配的CPU的时钟周期。①--cpu-period用于指定容器对CPU的使用要在多长时间内做一次重新分配。②--cpu-quota用于指定在这个周期内,最多可以运行容器的时间。和--cpu-shares不同的是,这种配置指定了一个绝对值,且没有弹性空间,容器对CPU资源的使用绝对不会超过配置的值。--cpu-period和--cpu-quota的单位为微秒;--cpu-period的最小值为1000μs,最大值为1s(10^6μs),默认值为0.1s(100000μs);--cpu-quota的值默认为-1,表示不做控制。任务3.2Docker容器资源控制相关知识3.2例1:如果容器进程需要每秒使用单个CPU的0.2s时间,则可以将cpu-period设置为1000000(1s),将cpu-quota设置为200000(0.2s)。在多核情况下,如果允许容器进程完全占用两个CPU,则可以将cpu-period设置为100000(即0.1s),即cpu-period的默认值,将cpu-quota设置为200000(0.2s)。[root@localhost~]#dockerrun-dit--cpu-period100000--cpu-quota200000busybox任务3.2Docker容器资源控制相关知识3.2容器创建完成后,可以在/sys/fs/cgroup/cpu,cpuacct/system.slice/docker-<容器的完整ID>.scope目录中查看cpu.cfs_period_us和cpu.cfs_quota_us文件。#cat/sys/fs/cgroup/cpu,cpuacct/system.slice/docker-1be3b854e1dba63bac9e178af85768b84a5cbf949a76cad05dc4c7073edc8b7.scope/cpu.cfs_period_us100000#cat/sys/fs/cgroup/cpu,cpuacct/system.slice/docker-f1be3b854e1dba63bac9e178af85768b84a5cbf949a76cad05dc4c7073edc8b7.scope/cpu.cfs_quota_us200000任务3.2Docker容器资源控制相关知识3.2例2:假如需要给此容器分配cpu使用率的20%,则参数需要设置为20000,相当于每个周期分配给这个容器0.2s。[root@localhost~]#dockerrun-itd--name=t1--cpu-quota20000busybox任务3.2Docker容器资源控制相关知识3.2(3)CPU内核控制对于多核CPU的服务器,Docker可以使用--cpuset-cpus和--cpuset-mems参数控制容器运行,限定使用哪些CPU内核和内存节点。其对具有NUMA拓扑(具有多CPU、多内存节点)的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器只有一个内存节点,则--cpuset-mems的配置基本上不会有明显效果。简而言之:--cpuset-cpus可以设置容器可以在哪些CPU核上运行。--cpuset-mems参数表示在NUMA系统上,我们可以设置容器可以使用的内存节点。例如,创建容器名为busybox1的容器,要求创建的容器只能使用0和1两个内核。[root@localhost~]#dockerrun-dit--namebusybox1--cpuset-cpus0-1busybox任务3.2Docker容器资源控制相关知识3.2(3)CPU内核控制容器创建完成后,可以在/sys/fs/cgroup/cpuset/system.slice/docker-<容器的完整ID>.scope目录中查看cpuset.cpus文件。#cat/sys/fs/cgroup/cpuset/system.slice/docker-f6b73673874dc3dad060428ad4dedd7500ef66a1ac2175c0249cdf0176ecdac.scope/cpuset.cpus0-1任务3.2Docker容器资源控制相关知识3.2内存配额控制Docker提供的内存限制功能有以下几点:容器能使用的内存和交换分区大小。容器的核心内存大小。容器虚拟内存的交换行为。容器内存的软性限制。是否杀死占用过多内存的容器。容器被杀死的优先级一般情况下,达到内存限制的容器过段时间后就会被系统杀死。3.2任务3.2Docker容器资源控制相关知识内存配额控制执行dockerrun命令时能使用的和内存限制相关的所有选项如下。3.2任务3.2Docker容器资源控制相关知识内存配额控制Docker通过如下参数来控制容器的内存使用配额,可以实现控制容器的swap大小、可用内存大小等。(1)--memory-swappiness:用于设置容器的虚拟内存控制行为,参数值为0~100,默认值为60,参数值越小,越倾向于使用物理内存。当参数值为100时,表示尽量使用swap分区;当参数值为0时,表示禁用容器swap功能。(2)--kernel-memory:核心内存限制,参数值最小为4MB。(3)--memory:设置容器使用的最大内存上限,默认单位为byte,可以使用KB、MB或GB等。任务3.2Docker容器资源控制相关知识3.2
(4)--memory-swap:等于内存和swap分区大小的总和,其设置为-1时,表示swap分区的大小是无限的。其默认单位为byte,可以使用KB、MB或GB等。如果--memory-swap的设置值小于--memory的值,则使用默认值,即--memory-swap值的两倍。
(5)--memory-reservation:启用弹性的内存共享,当宿主机资源充足时,允许容器尽量多地使用内存,当检测到内存竞争或者内存不充足时,强制将容器的内存降低到memory-reservation所指定的内存大小。若不设置此选项,有可能出现某些容器长时间占用大量内存的情况,导致性能上的损失。
默认情况下,容器可以使用宿主机上的所有空闲内存。任务3.2Docker容器资源控制相关知识3.2用户内存限制用户内存限制就是对容器能使用的内存和交换分区的大小作出限制。使用时要遵循两条直观的规则:-m,--memory选项的参数最小为4M。--memory-swap不是交换分区,而是内存加交换分区的总大小,所以--memory-swap必须比-m,--memory大。在这两条规则下,一般有四种设置方式。(1)不设置如果不设置-m,--memory和--memory-swap,容器默认可以用完宿主机的所有内存和swap分区。不过注意,如果容器占用宿主机的所有内存和swap分区超过一段时间后,会被宿主机系统杀死(如果没有设置–00m-kill-disable=true的话)。任务3.2Docker容器资源控制相关知识3.2
(2)设置-m,--memory
不设置--memory-swap给-m或--memory设置一个不小于4M的值,假设为a,不设置--memory-swap,或将--memory-swap设置为0。这种情况下,容器能使用的内存大小为a,能使用的交换分区大小也为a。因为Docker默认容器交换分区的大小和内存相同。如果在容器中运行一个一直不停申请内存的程序,你会观察到该程序最终能占用的内存大小为2a。比如$dockerrun-m1Gubuntu:16.04,该容器能使用的内存大小为1G,能使用的swap分区大小也为1G。容器内的进程能申请到的总内存大小为2G。任务3.2Docker容器资源控制相关知识3.2
(3)设置-m,--memory=a,--memory-swap=b,且b>a
给-m设置一个参数a,给--memory-swap设置一个参数b。a时容器能使用的内存大小,b是容器能使用的内存大小+swap分区大小。所以b必须大于a。b-a即为容器能使用的swap分区大小。比如$dockerrun-m1G--memory-swap3Gubuntu:16.04,该容器能使用的内存大小为1G,能使用的swap分区大小为2G。容器内的进程能申请到的总内存大小为3G。任务3.2Docker容器资源控制相关知识3.2
(4)设置-m,--memory=a,--memory-swap=-1给-m参数设置一个正常值,而给--memory-swap设置成-1。这种情况表示限制容器能使用的内存大小为a,而不限制容器能使用的swap分区大小。这时候,容器内进程能申请到的内存大小为a+宿主机的swap大小。任务3.2Docker容器资源控制相关知识3.2例如,创建容器名为memory1的容器,设置容器使用的最大内存为128MB。[root@localhost~]#dockerrun-tid--namememory1--memory128mbusybox默认情况下,Docker还为容器分配了同样大小的swap分区,如上面的代码创建出的容器实际上最多可以使用256MB内存,而不是128MB内存。如果需要自定义swap分区大小,则可以通过联合使用--memory-swap参数来实现控制。
任务3.2Docker容器资源控制相关知识3.2任务3.2Docker容器资源控制与CPU的CGroups配置类似,Docker容器在目录/sys/fs/cgroup/memory/system.slice/docker-<容器的完整ID>.scope中创建相应的CGroups配置文件,可通过查看memory.limit_in_bytes和memory.memsw.limit_in_bytes文件提取设置的值。#cat/sys/fs/cgroup/memory/system.slice/docker-8e2e1bd17b56afe4a803ecb161a3eaf52a28e6587fb50245e20f92bf5fa3737e.scope/memory.limit_in_bytes134217728 //128MB=128×1024×1024=134217728Byte#cat/sys/fs/cgroup/memory/system.slice/docker-8e2e1bd17b56afe4a803ecb161a3eaf52a28e6587fb50245e20f92bf5fa3737e.scope/memory.memsw.limit_in_bytes268435456 //256MB=256×1024×1024=268435456byte3.2任务3.2Docker容器资源控制注意:执行上述命令时,如果:出现下述提示信息,则表示主机上默认不启用CGrcroups来控制swap分区,需修改grub启动参数。WARNING:Yourkerneldoesnotsupportswaplimitcapabilities,memorylimitedwithoutswap3.2磁盘I/O配额控制Docker通过以下参数实现对磁盘I/O的控制,其中大多数参数必须在有宿主机设备的情况下使用。(1)--device-read-bps:限制设备的读速度,单位可以是KB/s、MB/s或GB/s。(2)--device-read-iops:限制设备每秒读I/O的次数。(3)--device-write-bps:限制设备的写速度,单位可以是KB/s、MB/s或GB/s。(4)--device-write-iops:限制设备每秒写I/O的次数。任务3.2Docker容器资源控制相关知识3.2(5)--blkio-weight:容器默认磁盘I/O的加权值,有效值为10~100。(6)--blkio-weight-device
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年数字孪生医疗产业发展政策建议
- 上海立信会计金融学院《安装工程计量》2025-2026学年第一学期期末试卷(A卷)
- 纸浆供需关系预测
- 上海立信会计金融学院《安全法规》2025-2026学年第一学期期末试卷(A卷)
- 上海立信会计金融学院《安全人机工程学》2025-2026学年第一学期期末试卷(B卷)
- 2026年海绵型建筑与小区设计施工导则
- 2026年合规尽职调查操作实务手册
- 上海科技大学《安装工程估价》2025-2026学年第一学期期末试卷(B卷)
- 大连东软信息学院《《中医外科学》诠说》2025-2026学年第一学期期末试卷(A卷)
- 2026年可吸收缝合线挤出成型与拉伸工艺
- 2026年四川省公务员《行测》考试真题-含答案版
- 2024年全国国家电网招聘之财务会计类考试重点专题卷(附答案)163
- 重庆南开中学校2025-2026学年九年级下学期3月月考语文试题(含答案)(含解析)
- 2026年广州市所民办学校小升初联合素质检测试题及答案
- 2026 年离婚协议书新版权威版
- 2025年南京市中医院医护人员招聘参考题库含答案解析
- EML340型连续采煤机使用维护说明书
- 2025四川绵阳富达资产经营有限责任公司市场化招聘下属绵阳市建设工程质量检测中心有限责任公司副总经理1人笔试历年参考题库附带答案详解
- 中医茶馆创业计划书
- 2025年海东辅警协警招聘考试真题附答案详解(满分必刷)
- 2025广东东莞市谢岗镇招聘编外聘用人员23人参考题库及答案详解(基础+提升)
评论
0/150
提交评论