Docker+K8S+DevOps微服务架构师

学神IT教育:从零基础到实战,从入门到精通!

版权声明:

  1. 本系列文档为《学神IT教育》内部使用教材和教案,只允许VIP学员个人使用,禁止私自传播。否则将取消其VIP资格,追究其法律责任,请知晓!
免责声明: 本课程设计目的只用于教学,切勿使用课程中的技术进行违法活动,学员利用课程中的技术进行违法活动,造成的后果与讲师本人及讲师所属机构无关。倡导维护网络安全人人有责,共同维护网络文明和谐。

联系方式:

学神IT教育官方网站: http://www.xuegod.cn

学神K8S精英学习11群QQ群: 957231097

2-docker容器命名和资源配额控制-笔记-v5 - 图1 2-docker容器命名和资源配额控制-笔记-v5 - 图2 2-docker容器命名和资源配额控制-笔记-v5 - 图3

学习顾问:小语老师 学习顾问:边边老师 学神微信公众号

微信扫码添加学习顾问微信,同时扫码关注学神公众号了解最新行业动态,获取更多学习资料及答疑就业服务!

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

本节所讲内容:

8.1 docker容器命名和重命名 8.2 创建docker容器实例时指定主机名 8.3 docker容器资源配额控制之cpu 8.4 docker容器资源配额控制之内存 8.5 docker 数据映射 8.6 docker容器资源配额控制之IO

前期准备:

还原快照到已经安装好docker的状态:

2-docker容器命名和资源配额控制-笔记-v5 - 图4

[root@xuegod63 ~]# systemctl start docker

[root@xuegod63 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos httpd 0fe32512008f 23 hours ago 304.5 MB

centos apache 38fa5452c20d 23 hours ago 304.3 MB

centos latest 196e0ce0c9fb 2 weeks ago 196.6 MB

8.1 docker容器命名和重命名

容器命名语法:docker run -d —name 容器实例名 容器镜像名 要执行的命令

容器重命名语法: docker rename 旧容器名 新容器名

例1:运行一个名字为docker1的容器

[root@xuegod63 ~]# docker run -itd —name docker1 centos:7.6.1810 /bin/bash

a651acdb6b4af511ce568a3a24762c56ba868b5adafaae0aa4ab9cd47d578062

注:如果本地没有centos:7.6.1810镜像,会自动下载

[root@xuegod63 ~]# docker ps #可以查看到

例2:将docke1容器重命名

[root@xuegod63 ~]# docker rename docker1 docker2

[root@xuegod63 ~]# docker ps

8.2 创建docker容器实例时指定容器的主机名

语法:docker run -it —name 容器名 -h 指定主机名 镜像 /bin/bash

例1:

[root@xuegod63 ~]# docker run -it —name docker3 -h docker63.cn centos bash

注:centos镜像代表centos:latest。没有指定tag标签,默认为latest

[root@docker63 /]# hostname #查看

docker63.cn

[root@docker63 /]# exit

让docker 容器开机自动启动

语法: docker run —restart=always -itd —name 容器名 镜像 /bin/bash

参数:—restart=always #在容器退出时总是重启容器。

例1:

[root@xuegod63 ~]# docker run —restart=always -itd —name test6666 centos bash

[root@xuegod63 ~]# systemctl restart docker

[root@xuegod63 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

40538c2bed0e centos “bash” 47 seconds ago Up 5 seconds test6666

扩展:

Docker容器的重启策略如下:

no,默认策略,在容器退出时不重启容器

on-failure,在容器非正常退出时(退出状态非0),才会重启容器

on-failure:3,在容器非正常退出时重启容器,最多重启3次 failure [ˈfeɪljə(r)] 失败

always,在容器退出时总是重启容器

unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。

如果创建时未指定 —restart=always ,可通过update 命令设置

语法:docker update —restart=always 容器ID或名字

例1:

[root@xuegod63 ~]# docker run -itd —name test888 centos bash

bb300ba81195597ae29016925d92904acaf1bb9c13061f3dd04d223ef6a6dc1f

[root@xuegod63 ~]# docker update —restart=always test888

[root@xuegod63 ~]# systemctl stop docker #停止服务

[root@xuegod63 ~]# systemctl start docker #开启docker服务

[root@xuegod63 ~]# docker ps | grep 888 #发现只设置了开机启动的docker实例会启动。说明咱们的配置是正确的。

bb300ba81195 centos “bash” 48 seconds ago Up 8 seconds test888

8.3 docker容器资源配额控制之cpu

Docker通过cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。

cgroup概述:

cgroup是Control Groups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘IO等等) 的机制,被LXC、docker等很多项目用于实现进程资源控制。cgroup将任意进程进行分组化管理的 Linux 内核功能。cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。

为什么要进行硬件配额?

当多个容器运行时,防止某容器把所有的硬件都占用了。(比如一台被黑的容器,有可能把所有的资源都占用)

8.3.1 指定docker容器可以使用的cpu份额

例1:给容器实例分配512权重的cpu使用份额

[root@xuegod63 ~]# docker run —help | grep cpu-shares

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分配和容器中进程运行情况。 例1:给容器实例分配512权重的cpu使用份额 参数: —cpu-shares 512 [root@xuegod63 ~]# docker run -it —cpu-shares 512 centos:7.6.1810 /bin/bash [root@df176dd75bd4 /]# cat /sys/fs/cgroup/cpu/cpu.shares #查看结果: 512 注:稍后,我们启动多个容器,测试一下是不是只能使用512份额的cpu资源。单独一个容器,看不出来使用的cpu的比例。 因没有docker实例同此docker实例竞争。 ### 8.3.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) 。 例: 大型机 Z14 ### 8.3.3 扩展技术taskset命令 taskset设定cpu亲和力,taskset能够将一个或多个进程绑定到一个或多个处理器上运行。 参数: -c, —cpu-list 以列表格式显示和指定 CPU -p, —pid 在已经存在的pid 上操作 例1:设置只在cupID是1和2的cpu上运行sshd进程程序。第一个cpu的ID是0 [root@xuegod63 ~]# ps -axu | grep sshd root 1450 0.0 0.0 82544 3604 ? Ss 06:52 0:00 /usr/sbin/sshd -D [root@xuegod63 ~]# taskset -cp 1,2 1450 pid 1450’s current affinity list: 0-3 pid 1450’s new affinity list: 1,2 affinity [əˈfɪnəti] 密切关系

例2:查看ID为1的进程在哪个cpu上运行

[root@xuegod63 ~]# taskset -cp 1

pid 1’s current affinity list: 0-3

扩展:centos7中PID为1的进程是: systemd ; centos6中PID为1的进程是:init

[root@xuegod63 ~]# pstree -p | more # 查看进程树。也可以查看木马的父进程

systemd(1)-+-ModemManager(678)-+-{ModemManager}(704)

  1. | `-{ModemManager}(709)

互动:为什么把进程绑定到cpu上,运行效率就高?

注:当cpu数量很多时,确实需要绑定进程到cpu上,这样可以减少cpu上下文切换的开销,节约时间。

例4:物理机一共有16个核心,创建的容器只能用0、1、2这三个核心。

[root@xuegod63 ~]# docker run -it —name cpu1 —cpuset-cpus 0-2 centos:7.6.1810 bash

[root@ad554956e989 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus

0-2

[root@b3f567c41a1a /]# taskset -cp 1 pid 1’s current affinity list: 0-2 [root@4ab931718502 /]# ps -axu #对于我当前的docker实例中,PID为1的进程是 /bin/bash USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.5 0.0 11776 1932 ? Ss 13:23 0:00 /bin/bash

8.3.4 CPU配额控制参数的混合使用

当上面这些参数中时,cpu-shares控制只发生在容器竞争同一个cpu的时间片时有效。

如果通过cpuset-cpus指定容器A使用cpu 0,容器B只是用cpu1,在主机上只有这两个容器使用对应内核的情况,它们各自占用全部的内核资源,cpu-shares没有明显效果。

互动:如何才能有效果?

容器A和容器B配置上cpuset-cpus值并都绑定到同一个cpu上,然后同时抢占cpu资源,就可以看出效果了。

例1:测试cpu-shares和cpuset-cpus混合使用运行效果,就需要一个压缩力测试工具stress来让容器实例把cpu跑满。

如何把cpu跑满? 如何把4核心的cpu中第一和第三核心跑满?可以运行stress,然后使用taskset绑定一下cpu。

先扩展:stress命令

概述:linux系统压力测试软件Stress 。 stress可以测试Linux系统cpu/menory/IO/disk 的负载。

下载页:

http://people.seas.harvard.edu/~apw/stress/

2-docker容器命名和资源配额控制-笔记-v5 - 图5

注:也可以使用epel源中的stress-xxx.rpm 。

今天的这个内容不难。 因为你今天第一次知道这个知识!!! 回去练习。

[root@xuegod63 ~]# yum install -y epel-release [root@xuegod63 ~]# yum install stress -y

tress参数解释

-? 显示帮助信息

-v 显示版本号

-q 不显示运行信息

-n 显示已完成的指令情况

-t —timeout N 指定运行N秒后停止

  1. --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函数的进程

  1. -hadd-bytes B 指定写的字节数
  2. --hadd-noclean unlink
注:时间单位可以为秒s,分m,小时h,天d,年y,文件大小单位可以为K,M,G

例1:产生2个cpu进程,2个io进程,20秒后停止运行

[root@xuegod63 stress-1.0.4]# stress -c 2 -i 2 —verbose —timeout 20s

如果执行时间为分钟,改20s 为1m

查看:

2-docker容器命名和资源配额控制-笔记-v5 - 图6

例2:测试cpuset-cpus和cpu-shares混合使用运行效果,就需要一个压缩力测试工具stress来让容器实例把cpu跑满。 当跑满后,会不会去其他cpu上运行。 如果没有在其他cpu上运行,说明cgroup资源限制成功。 实例3:创建两个容器实例:docker10 和docker20。 让docker10和docker20只运行在cpu0和cpu1上,最终测试一下docker10和docker20使用cpu的百分比。实验拓扑图如下: 2-docker容器命名和资源配额控制-笔记-v5 - 图7 运行两个容器实例 [root@xuegod63 ~]# docker run -itd —name docker10 —cpuset-cpus 0,1 —cpu-shares 512 centos:7.6.1810 /bin/bash #指定docker10只能在cpu0和cpu1上运行,而且docker10的使用cpu的份额512 #参数-itd就是又能打开一个伪终端,又可以在后台运行着docker实例 [root@xuegod63 ~]# docker run -itd —name docker20 —cpuset-cpus 0,1 —cpu-shares 1024 centos:7.6.1810 /bin/bash #指定docker20只能在cpu0和cpu1上运行,而且docker20的使用cpu的份额1024,比dcker10多一倍 测试1: 进入docker10,使用stress测试进程是不是只在cpu0,1上运行:

[root@xuegod63 ~]# docker exec -it docker10 /bin/bash

[root@d1a431815090 /]# yum install -y epel-release #安装epel扩展源 [root@d1a431815090 /]# yum install stress -y #安装stress命令 [root@d1a431815090 /]# stress -c 2 -v -t 10m #运行2个进程,把两个cpu占满 在物理机另外一个虚拟终端上运行top命令,按1快捷键,查看每个cpu使用情况: 2-docker容器命名和资源配额控制-笔记-v5 - 图8 可看到正常。只在cpu0,1上运行 测试2: 然后进入docker20,使用stress测试进程是不是只在cpu0,1上运行,且docker20上运行的stress使用cpu百分比是docker10的2倍

[root@xuegod63 ~]# docker exec -it docker20 /bin/bash

[root@d1a431815090 /]# yum install -y epel-release #安装epel扩展源 [root@d1a431815090 /]# yum install stress -y [root@f24e75bca5c0 /]# stress -c 2 -v -t 10m

在另外一个虚拟终端上运行top命令,按1快捷键,查看每个cpu使用情况:

2-docker容器命名和资源配额控制-笔记-v5 - 图9

注:两个容器只在cpu0,1上运行,说明cpu绑定限制成功。而docker20是docker10使用cpu的2倍。说明—cpu-shares限制资源成功。

8.3.5 了解CPU周期控制

希望开拓一下眼界!

docker提供了—cpu-period(周期)、—cpu-quota两个参数控制容器可以分配到的CPU时钟周期。

period [ˈpɪəriəd] 周期,时期 quota [ˈkwəʊtə] 配额

—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实例每1秒只能使用单个CPU的0.2秒时间,可以将cpu-period设置为1000000(即1秒),cpu-quota设置为200000(0.2秒)。

[root@xuegod63 ~]# docker run -it —cpu-period 1000000 —cpu-quota 200000 centos /bin/bash

[root@0363ce23f262 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us #查看

1000000

[root@0363ce23f262 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us

200000

8.3.6 docker容器实例运行结束后自动释放资源

[root@xuegod63 ~]# docker run —help | grep rm

  1. --rm 参数: Automatically remove the container when it exits

作用:当容器命令运行结束后,自动删除容器,自动释放资源

应用场景:在某些环境下,可能需要大量的新建docker实例,然后仅仅运行几秒钟或几分钟,然后就彻底删除。 如运行单元测试或测试弹性云计算。

例:阿里云,要模拟双11的压力,需要快速创建1万docker实例,每个docker容器实例中都运行ab命令,拼命访问tmall.com首页,运行1个小时,1小时后自动删除。

例:

[root@xuegod63 ~]# docker run -it —rm —name mk centos:7.6.1810 sleep 5

物理上查看:

[root@xuegod63 ~]# docker ps -a | grep mk

6c75a9317a6b centos “sleep 5” 6 seconds ago Up 4 seconds mk

等5s后,再查看:

[root@xuegod63 ~]# docker ps | grep mk #自动删除了

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

Docker提供参数-m, —memory=””限制容器的内存使用量。

例1:允许容器使用的内存上限为128M:

[root@xuegod63 ~]# docker run -it -m 128m centos:7.6.1810

查看:

[root@40bf29765691 /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes

134217728

注:也可以使用tress进行测试,到现在,我可以限制docker实例使用cpu的核心数和权重,可以限制内存大小。

例2:创建一个docker,只使用2个cpu核心,只能使用128M内存

[root@xuegod63 ~]# docker run -it —cpuset-cpus 0,1 -m 128m centos:7.6.1810

8.5 docker数据映射

docker用来做计算,数据存储通过外挂实现。

语法:docker run -itd -v /src:/dst centos:7.6.1810 bash #

-v 用来指定挂载目录, 冒号: 前面的/src为物理机本地目录,:后面的/dst 为容器里的目录:

例1:把物理机上的/var/www/html映射到docker实例的/var/www/html 。

好处: 这样当docker坏了,数据还在物理机上,再使用apache镜像启动一个docker实例就可以了。 数据不丢失。

[root@xuegod63 ~]# mkdir -p /var/www/html

[root@xuegod63 ~]# docker run -it —name web1 -v /var/www/html/:/var/www/html centos bash

[root@8fb49e536af4 /]# echo aaa > /var/www/html/index.html

物理机查看:

[root@xuegod63 ~]# ls /var/www/html/

index.html

8.6 docker容器资源配额控制之IO

[root@xuegod63 ~]# docker run —help | grep write-b

  1. --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。

—device参数:将主机设备添加到容器

[root@xuegod63 ~]# mkdir -p /var/www/html/

[root@xuegod63 ~]# docker run -it -v /var/www/html/:/var/www/html —device /dev/sda:/dev/sda —device-write-bps /dev/sda:1mb centos /bin/bash

[root@bd79042dbdc9 /]# time dd if=/dev/sda of=/var/www/html/test.out bs=1M count=50 oflag=direct,nonblock

注:dd 参数:

direct:读写数据采用直接IO方式,不走缓存。直接从内存写硬盘上。

nonblock:读写数据采用非阻塞IO方式,优先写dd命令的数据

50+0 records in 50+0 records out 52428800 bytes (52 MB) copied, 50.1831 s, 1.0 MB/s real 0m50.201s user 0m0.001s sys 0m0.303s 注: 发现1秒写1M。 限制成功。

总结:

8.1 docker容器命名和重命名 8.2 创建docker容器实例时指定主机名 8.3 docker容器资源配额控制之cpu 8.4 docker容器资源配额控制之内存 8.5 docker 数据映射 8.6 docker容器资源配额控制之IO