一、CPU 资源控制:
1.cgroups:
cgroups,是一个非常强大的linux内核工具 ,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups(Control groups)实现了对资源的配额和度量。
cgroups四大功能:
- 资源限制:可以对任务使用的资源总额进行限制
- 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
- 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
- 任务控制:cgroup可以对任务执行挂起、恢复等操作
2.cpu资源控制:
2.1.设置CPU使用率上限:
1.Linux通过CFS (Completely Fair Scheduler,完全公平调度器 )**来调度各个进程对CPU的使用。**CFS默认的调度周期是100ms。 我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。
2.使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。
修改默认的容器时间分片上限规则:
#cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU
2.2.CPU压力测试:
进入容器:
bash
docker exec -it 容器名 /bin/bash
编写脚本:
bash
#!/bin/bash
i=0
while true
do
let i++
done
bash
chmod +x cpu.sh
./cpu.sh
#执行脚本
创建容器时指定容器的cpu资源占用量上限:
bash
设置50%的比例分配CPU使用时间上限
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash
设置CPU资源占用比(设置多个容器时才有效)
创建容器时可以使用选项 --cpu-shares 数值(该数值要为1024的倍数,1024代表一份,当个容器占用cpu的份额由自身分配的份数除于所有容器占用cpu的份数,就为该容器所占用cpu资源的百分比)
bash
Docker 通过 --cpu-shares 指定 CPU 份额,默认值为1024,值为1024的倍数。
#创建两个容器为 c1 和 c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3。
docker run -itd --name test01 --cpu-shares 512 centos:7
docker run -itd --name test02 --cpu-shares 1024 centos:7
分别进入容器,进行压力测试
bash
#下载epel源
yum install -y epel-release
#下载压测工具
yum install -y stress
#进行四个线程压测
stress -c 4 #产生四个进程,每个进程都反复不停的计算随机数的平方根
#再开启一个终端查看测试结果
docker stats
2.3.设置容器绑定指定的CPU:
先分配虚拟机4个CPU核数
bash
docker run -itd --name test03 --cpuset-cpus 1 centos:7 /bin/bash
bash
进入容器,进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4
二、docker数据管理:
管理 Docker 容器中数据主要有两种方式:
数据卷(Data Volumes) 和数据卷容器(DataVolumes Containers)。
在生成容器的同时,加上 -v 选项,指定把当前服务器的目录映射到容器中,实现docker持久化!
1.数据卷(Data Volumes):
1.1.概述:
数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作。
1.2.原理:
将容器内部的配置文件目录,挂载到宿主机指定目录下
数据卷默认会一直存在,即使容器被删除。
宿主机和容器是两个不同的名称空间,如果想进行连接需要用ssh,exec和attch也类似于ssh这种方式登录。
在企业中ssh这种登陆方式会比较危险,安全漏洞很大,尽量减少ssh这种,杜绝了频繁使用exec。
因此使用数据卷的方式把容器内部的文件目录挂载到宿主机指定目录下进行修改,当容器里的文件频繁需要修改时不需要登陆进去,直接使用数据卷方式在宿主机指定的目录下进行修改即可,方便又安全。
1.3.作用:
Docker容器删除后,在容器中产生的数据也会随之销毁,所以使用数据卷避免这种情况。由Docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System(联合文件系统),提供一些用于持续存储或共享数据的特性。
1.4.示例:宿主机目录 /var/test 挂载同步到容器中的 /data1
注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。
把宿主机挂载到容器内部
bash
docker run -it --name rgangan3 -v /var/test:/data1 nginx:latest /bin/bash
bash
cd /var && ls
在容器中创建文件num01.txt并查看:
bash
echo "this is num01 file" > /data1/num01.txt
cat /var/test/num01.txt
2.数据卷容器(DataVolumes Containers):
2.1.概述:
数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。
2.2.作用:
让两个容器实现数据共享。
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。
2.3.示例:创建并使用数据卷容器:
创建一个容器 rgangan4 作为数据卷容器并创建文件 1.txt 与 2.txt
bash
#创建并进入容器
docker run -it --name rgangan3 -v /data1 -v /data3 nginx:latest /bin/bash
#容器内创建测试文件1、2
echo "this is 1 file" > /data1/1.txt
echo "THIS IS 2 FILE" > /data3/2.txt
使用 --volumes-from 挂载容器 rgangan5 中的数据卷到新的容器 :
bash
#创建并进入容器
docker run -it --name rgangan5 --volumes-from rgangan4 nginx:latest /bin/bash
#查看测试数据是否同步
cat data1/1.txt
cat data3/2.txt
3.容器互联:--link:
使用centos镜像,容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。
简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。
bash
1、创建并运行源容器取名web1
docker run -itd -P --name web1 centos:7 /bin/bash
2、创建并运行接收容器取名web2
#使用--link选项指定连接容器以实现容器互联
docker run -itd -P --name web2 --link web1:web2 centos:7 /bin/bash
3、进入web2容器验证
docker exec -it web2 bash
ping web1
也可以直接取消后台-d 直接进入web2容器ping web1