docker容器命名和资源配额控制

一、 docker容器命名和重命名

1、 docker容器命名
语法:docker run –dit --name 容器名称 容器镜像:标签 执行命名
例子:启动一个名字为docker1的容器实例
[root@xuegod110 ~]# docker run -dit --name docker1 centos:latest bash
[root@xuegod110 ~]# docker ps在这里插入图片描述

2、 docker容器重命名
语法:docker rename 旧容器名 新容器名
例子:将docker1重命名为docker2
[root@xuegod110 ~]# docker rename docker1 docker2
在这里插入图片描述

二、 指定容器的主机名和指定容器开机自启动

1、 创建docker容器实例时指定主机名
语法:docker run –it --name 容器名 –h实例主机名 镜像名:标签 执行命令
[root@xuegod110 ~]# docker run -it --name docker3 -h docker3.com centos:latest bash
在这里插入图片描述

2、 指定容器开机自动启动
语法:docker run –dit --restart=always –name 容器名 镜像:标签 执行命令
[root@xuegod110 ~]# docker run -dit --name docker4 --restart=always centos:latest bash
查看docker4实例的状态
在这里插入图片描述
重启docker服务(即容器实例重启开机)
[root@xuegod110 ~]# systemctl restart docker
可以看到能实现自动开机的只有实例docker4,因为设置了开机启动
在这里插入图片描述
扩展:
Docker 容器的重启策略如下:
no,默认策略,在容器退出时不重启容器
on-failure,在容器非正常退出时(退出状态非 0),才会重启容器
on-failure:3,在容器非正常退出时重启容器,最多重启 3 次 failure
always,在容器退出时总是重启容器
unless-stopped,在容器退出时总是重启容器,但是不考虑在 Docker 守护进场启动时就已经停止了的容器。

3、 给已经启动的容器实例增加开机启动
语法:docker update --restart=always 容器ID和名字
[root@xuegod110 ~]# docker update --restart=always docker3
docker3
再次重启docker服务,查看实例docker3会不会开机自启动
在这里插入图片描述

三、 docker容器资源配额控制之CPU

Docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
cgroup 概述:
cgroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘 IO 等等) 的机制,被 LXC、docker 等很多项目用于实现进程资源控制。cgroup 将任意进程进行分组化管理的 Linux 内核功能。cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。
为什么要进行硬件配额?
当多个容器运行时,防止某容器把所有的硬件都占用了。(比如一台被黑的容器,有可能把所有的资源都占用)
1、 指定docker容器可以使用的cpu份额
语法:docker run –dit --cpu-share 数字(512) 镜像:标签 执行命令
cpu 配额参数:-c, --cpu-shares int CPU shares (relative weight) 在创建容器时指定容器所使用的 CPU 份额值。cpu-shares 的值不能保证可以获得 1 个 vcpu 或者多少 GHz 的 CPU 资源,仅仅只是一个弹性的加权值。

默认每个 docker 容器的 cpu 份额值都是 1024。在同一个 CPU 核心上,同时运行多个容器时,容器的 cpu 加权的效果才能体现出来。

例: 两个容器 A、B 的 cpu 份额分别为 1000 和 500,结果会怎么样?
情况 1:A 和 B 正常运行,在 cpu 进行时间片分配的时候,容器 A 比容器 B 多一倍的机会获得 CPU的时间片。
情况 2:分配的结果取决于当时其他容器的运行状态。比如容器 A 的进程一直是空闲的,那么容器 B是可以获取比容器 A 更多的 CPU 时间片的; 比如主机上只运行了一个容器,即使它的 cpu 份额只有 50,它也可以独占整个主机的 cpu 资源。
cgroups 只在多个容器同时争抢同一个 cpu 资源时,cpu 配额才会生效。因此,无法单纯根据某个容器的 cpu 份额来确定有多少 cpu 资源分配给它,资源分配结果取决于同时运行的其他容器的 cpu 分配和容器中进程运行情况。
例子:给容器实例分配512权重的cpu使用份额
[root@xuegod110 ~]# docker run -dit --cpu-shares 512 --name docker5 -h docker5.com --restart=always centos:latest bash
解释:指定cpu权重512,容器名称为docker5,主机名是docker5.com,设置开机自启动

2、 CPU core核心控制
参数:–cpuset 可以绑定 CPU
对多核 CPU 服务器,docker 控制容器运行限定使用哪些 cpu 内核和内存节点,即使用
–cpuset-cpus 和–cpuset-mems 参数。对具有 NUMA 拓扑(具有多 CPU、多内存节点)的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器只有一个内存节点,则–cpuset-mems 的配置基本上不会有明显效果。

扩展:
服务器架构一般分: SMP、NUMA、MPP 体系结构介绍
从系统架构来看,目前的商用服务器大体可以分为三类:
1)即对称多处理器结构(SMP : Symmetric Multi-Processor) 例:x86 服务器,双路服务器。
主板上有两个物理 cpu
2)非一致存储访问结构 (NUMA:Non-Uniform Memory Access) 例:IBM小型机pSeries 690
3)海量并行处理结构 (MPP : Massive ParallelProcessing) 。 例: 大型机

3、 扩展技术taskset命令
taskset 设定 cpu 亲和力,taskset 能够将一个或多个进程绑定到一个或多个处理器上运行。
参数:
-c, --cpu-list 以列表格式显示和指定 CPU
-p, --pid 在已经存在的 pid 上操作

例1:设置cpuid是1和2的CPU上运行sshd进程
[root@xuegod110 ~]# ps -aux | grep sshd #查询sshd的PID号
root 1016 0.0 0.1 112796 4288 ? Ss 21:01 0:00 /usr/sbin/sshd -D
[root@xuegod110 ~]# taskset -cp 1016 #查询sshd运行在那个CPU上
pid 1016’s current affinity list: 0-3
[root@xuegod110 ~]# taskset -cp 1,2 1016 #设置sshd运行在1和2CPU上
pid 1016’s current affinity list: 0-3
pid 1016’s new affinity list: 1,2

例2:查看PID为1的进程运行在哪个CPU上
root@xuegod110 ~]# taskset -cp 1
pid 1’s current affinity list: 0-3
扩展:centos7 中 PID 为 1 的进程是:systemd ; centos6中PID为 1 的进程是:init

例3:创建容器实例只能运行在cpu0-2这三个CPU上
[root@xuegod110 ~]# docker run -it --name docker6 --cpuset-cpus 0-2 --cpu-shares 512 centos:latest bash
[root@b080bcbc0f52 /]# taskset -cp 1 #只能运行在0-2
pid 1’s current affinity list: 0-2
[root@b080bcbc0f52 /]# ps -aux | grep 1 #PID为1的进程是bash
root 1 0.1 0.0 11820 1924 pts/0 Ss 13:38 0:00 bash

4、 CPU配额控制参数的混合使用
当上面这些参数中时,cpu-shares 控制只发生在容器竞争同一个 cpu 的时间片时有效。
如果通过 cpuset-cpus 指定容器 A 使用 cpu 0,容器 B 只是用 cpu1,在主机上只有这两个容器使用对应内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。
互动:如何才能有效果?
容器 A 和容器 B 配置上 cpu-shares 值并都绑定到同一个 cpu 上,然后同时抢占 cpu 资源,就可以看出效果了。
例 1:测试 cpu-shares 和 cpuset-cpus 混合使用运行效果,就需要一个压缩力测试工具 stress 来让容器实例把 cpu 跑满。
如何把 cpu 跑满? 如何把 4 核心的 cpu 中第一和第三核心跑满?
先扩展:stress 命令
概述:linux 系统压力测试软件 Stress 。 stress 可以测试 Linux 系统 cpu/menory/IO/disk 的负载。
下载页:
http://people.seas.harvard.edu/~apw/stress/
也可以使用epel-release进行yum下载

stress参数解释:
-? 显示帮助信息
-v 显示版本号
-q 不显示运行信息
-n 显示已完成的指令情况
-t --timeout N 指定运行 N 秒后停止
–backoff N 等待 N 微妙后开始运行
-c 产生 n 个进程 每个进程都反复不停的计算随机数的平方根,测试 cpu
-i 产生 n 个进程每个进程反复调用 sync(),sync()用于将内存上内容写到硬盘上,测试磁盘
-m --vm n 产生 n 个进程,每个进程不断调用内存分配 malloc()和内存释放 free()函数 ,
测试内存
–vm-bytes B 指定 malloc 时内存的字节数 (默认 256MB)
–vm-hang N 指定在 free 栈的秒数
-d --hadd n 产生 n 个执行 write 和 unlink 函数的进程
-hadd-bytes B 指定写的字节数
–hadd-noclean 不unlink
注:时间单位可以为秒 s,分 m,小时 h,天 d,年 y,文件大小单位可以为 K,M,G

安装stress命令
[root@xuegod110 ~]# yum -y install epel-release
[root@xuegod110 ~]# yum -y install stress

例1:产生2个cpu进程,2个io进程,20s后停止
[root@xuegod110 ~]# stress -c 2 -i 2 --verbose --timeout 20s
在这里插入图片描述

例2:测试cpuset-cpus和cpu-shares混合使用效果
使用stress工具来让容器实例把cpu跑满。 当跑满后,会不会去其他cpu上运行。如果没有在其他cpu上运行,说明cgroup资源限制成功。
创建两个容器实例:docker10和docker20,让docker10和docker20只运行在cpu0和cpu1上,给docker10分配512的cpu权重,docker20分配1024的cpu权重。最终测试下docker10和docker20使用cpu百分比。

创建两个容器实例
[root@xuegod110 ~]# docker run -dit --name docker10 --cpuset-cpus 0-1 --cpu-shares 512 centos:latest bash
[root@xuegod110 ~]# docker run -dit --name docker20 --cpuset-cpus 0-1 --cpu-shares 1024 centos:latest bash

进入docker10容器实例,使用stress命令,让cpu跑满
[root@xuegod110 ~]# docker exec -it docker10 bash
[root@668420b811b7 /]# yum -y install epel-release
[root@668420b811b7 /]# yum -y install stress
[root@668420b811b7 /]# stree -c 2 -v -t 10m #运行两个cpu进程,跑满cpu
另起一个终端,使用top命令进行查看,按下1快捷键,查看每个cpu的使用情况
[root@xuegod110 ~]# docker exec -it docker10 bash
[root@668420b811b7 /]# top #只占用0-1CPU,开启了2个cpu进程
在这里插入图片描述

进入容器实例docker20,使用stress命令,让cpu跑满
[root@xuegod110 ~]# docker exec -it docker20 bash
[root@f6399f216807 /]# yum -y install epel-release
[root@f6399f216807 /]# yum -y install stress
[root@f6399f216807 /]# stree -c 2 -v -t 10m #运行两个cpu进程,跑满cpu
另起一个终端,使用top命令进行查看,按下1快捷键,查看每个cpu的使用情况
[root@f6399f216807 /]# top
在这里插入图片描述
注:这里要看出来效果,需要两个容器实例同时启动,并且同时跑stress压测命令,33:66就是1:2的cpu权重比例。

5、 了解CPU周期控制
docker提供了–cpu-period(周期)、–cpu-quota两个参数控制容器可以分配到的CPU时钟周期。
–cpu-period 是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配。 指定周期
–cpu-quota 是用来指定在这个周期内,最多可以有多少时间片断用来跑这个容器。 指定在这个周期中使用多少时间片
跟–cpu-shares 不同的,–cpu-period 和–cpu-quota 是指定一个绝对值,而且没有弹性在里面,容器对 CPU 资源的使用绝对不会超过配置的值。
cpu-period 和 cpu-quota 的单位为微秒(μs)。cpu-period 的最小值为 1000 微秒,最大值为 1秒(10^6 μs),默认值为 0.1 秒(100000 μs)。cpu-quota 的值默认为-1,表示不做控制。时间换算单位: 1 秒=1000 毫秒 ; 1 毫秒=1000 微秒

例1:设置docker实例每一秒钟只能使用单个cpu的0.2秒时间,可以将cpu-period设置为1000000(即1S),cpu-quota设置为20000(0.2S)
[root@xuegod110 ~]# docker run -dit --name docker7 --cpu-period 1000000 --cpu-quota 20000 centos:latest bash
[root@xuegod110 ~]# docker exec -it docker7 bash
[root@feb815308ddb /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us #查看设定的值
1000000
[root@feb815308ddb /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
20000

6、 docker容器实例运行结束后自动释放资源
–rm 参数: Automatically remove the container when it exits
作用:当容器命令运行结束后,自动删除容器,自动释放资源
应用场景:在某些环境下,可能需要大量的新建 docker 实例,然后仅仅运行几秒钟或几分钟,然后就彻底删除。 如运行单元测试或测试弹性云计算。
例:阿里云,要模拟双 11 的压力,需要快速创建 1 万 docker 实例,每个 docker 容器实例中都运行 ab 命令,拼命访问 tmall.com 首页,运行 1 个小时,1 小时后自动删除。

例:创建容器实例,运行5s中后删除
[root@xuegod110 ~]# docker run -dit --name docker8 --rm centos:latest sleep 5
在这里插入图片描述
等待5S后,再次查看,已经自动删除
在这里插入图片描述

四、 docker容器资源配额控制之内存

1、 内存
Docker 提供参数-m, --memory=""限制容器的内存使用量
例1:启动docker实例,使用内存上线为128M
[root@xuegod110 ~]# docker run -it --name docker8 -m 128m centos:latest bash
[root@c22ce95d96e7 /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes
134217728

例2:启动docker实例,只使用2个cpu核心,只能使用128M内存
[root@xuegod110 ~]# docker run -it --name docker9 --cpuset-cpus 0-1 -m 128m centos:latest bash

五、 docker数据映射

语法:docker run –dit –v /src:/dst centos:latest bash
-v 用来指定挂载目录, 冒号: 前面的/src 为物理机本地目录,:后面的/dst 为容器里的目录:

例1:把物理机上的/var/ww/html映射到docker实例的/var/www/html
[root@xuegod110 ~]# mkdir -p /var/www/html/
[root@xuegod110 ~]# docker run -dit --name docker11 -v /var/www/html:/var/www/html centos:latest bash
[root@xuegod110 ~]# echo xuegod110 > /var/www/html/index.html #在物理机上写入文件
[root@xuegod110 ~]# docker exec -it docker11 bash
[root@5be95cdaaa29 /]# cat /var/www/html/index.html #容器实例查看
xuegod110

六、 docker容器资源配额控制之IO

参数:–device-write-bps value Limit write rate (bytes per second) to a device
(default []) #限制此设备上的写速度(bytes per second),单位可以是 kb、mb 或者 gb。
–device-read-bps value #限制此设备上的读速度(bytes per second),单位可以是 kb、mb
或者 gb。
为什么阿云平台上 普通云盘的 IO 为: 1000 IOPS ,为什么这么小?
原因是 一台存储 给 2000 台云主机使用,需要控制一下 。防止某台云主机吃光你的磁盘 I / O 资源
情景:防止某个 Docker 容器吃光你的磁盘 I / O 资源
例 1:限制容器实例对硬盘的最高写入速度设定为 1MB/s。
[root@xuegod110 ~]# mkdir -p /var/www/html/
[root@xuegod110 ~]# docker run -dit --name docker12 -v /var/www/html/:/var/www/html/ --device /dev/sda:/dev/sda --device-write-bps/dev/sda:1mb centos:latest bash
[root@xuegod110 ~]# docker exec -it docker12 bash
[root@5189f431b4ed /]# time dd if=/dev/sda of=/var/www/html/test.out bs=1M count=5 oflag=direct,nonblack
5+0 records in
5+0 records out
5242880 bytes (5.2 MB) copied, 5.01702 s, 1.0 MB/s #IO配额设置成功

real 0m5.039s
user 0m0.000s
sys 0m0.012s

注:dd 参数:
direct:读写数据采用直接 IO 方式,丌走缓存。直接从内存写硬盘上。
nonblock:读写数据采用非阻塞 IO 方式,优先写 dd 命令的数据

总结:本章节所有命令集合使用

[root@xuegod110 ~]# docker run -dit --name docker --restart=always -h docker.com --cpu-shares 512 --cpuset-cpus 0-2 --cpu-period 1000000 --cpu-quota 200000 -m 1024m -v /var/www/html/:/var/www/html/ --device /dev/sda:/dev/sda --device-write-bps /dev/sda:1mb --rm centos:latest /bin/bash sleep 5

命令解释:
–name :指定容器名称
–restart=always :设置容器开机自启动
-h :指定容器主机名
–cpu-shares :设置cpu的权重值
–cpuset-cpus:设置cpu的亲和力,运行在哪个cpu上
–cpu-period:设置每1S对cpu的使用时间进行重新分配
–cpu-quota:没0.2秒使用cpu一次
-m:设置容器运行的内存大小
-v:设置数据映射,冒号前是物理机,冒号后是容器的目录
–device:映射的物理机磁盘
–device-write-bps:映射物理磁盘的写入速度
–rm:容器实例运行多长时间后自动删除,sleep 5表示5秒钟后删除

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值