目录
一、docker资源控制
1、资源控制工具
2、设置CPU使用率上限
3、CPU压力测试
4、Cgroups限制cpu使用率
5、查看容器运行状态
6、 配置容器指定CPU
7、限制容器内存使用
8、对磁盘IO配额控制(blkio)的限制
二、docker数据管理
1、数据管理类型
2、数据卷
3、数据卷容器
4、端口映射
5、容器的互联
一、docker资源控制
1、资源控制工具
cgroups;是一个非常强大的linux内核工具,不仅可以限制被namespace隔离起来的资源,还可以为资源设置权重,计算使用量,操控进程启停等,所以cgroups 实现了对资源的配额和度量
cgroups四大功能:
资源限制:可以对任务使用的资源总额进行限制
优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
任务控制:cgroup可以对任务执行挂起、恢复等操作
2、设置CPU使用率上限
Linux通过CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。
CPU周期:指的是CFS调度CPU遍历处理一次容器所有的进程时长,默认是0.1s。设置范围为1ms~1s
Cgroups限制时间:使用cpu.cfs_quota_us 即可设置在每个周期内容器能使用的CPU的时长,默认是-1即不限制。
CPU利用率:Cgroups限制时间/CPU周期,默认Cgroups是-1而CPU周期为0.1s表示用满CPU
查看CPU默认配置:
3、CPU压力测试
docker run -itd --name test5 centos:7 /bin/bash
#创建名为test5的centos7容器
docker ps -a
#查看docker容器id
docker exec -it 容器唯一id/容器名 /bin/bash
#进入容器中
vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
#编辑脚本
chmod +x /cpu.sh
#添加执行权限
./cpu.sh
#执行脚本
新开一个shell脚本
top查看cpu占用率,按1查看使用的那个cpu
4、Cgroups限制cpu使用率
5、查看容器运行状态
docker stats
6、 配置容器指定CPU
7、限制容器内存使用
选项: -m(--memory=) 选项用于限制容器可以使用的最大内存
docker run -itd --name test8 -m 512m centos:7 /bin/bash
#创建并启动容器centos7命名为test8,限制最大内存为512mb
docker stats
#查看容器运行状态
选项: -m(--memory=) 选项用于限制容器可以使用的最大内存
docker run -itd --name test8 -m 512m centos:7 /bin/bash
#创建并启动容器centos7命名为test8,限制最大内存为512mb
docker stats
#查看容器运行状态
8、对磁盘IO配额控制(blkio)的限制
--device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。
#例:docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash
--device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。
#例:docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
--device-read-iops :限制读某个设备的iops(次数)
--device-write-iops :限制写入某个设备的iops(次数)
二、docker数据管理
1、数据管理类型
管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)
2、数据卷
数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作,可以互相同步内容
mkdir /var/www
#宿主机创建目录
docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
#创建容器centos7并命名为web1.将宿主机的/var/www目录挂载到容器中的/data1卷中
# -v 选项表示容器中创建数据卷
echo "this is web1" > /data1/a.txt
exit
#数据卷中创建内容a.txt并退出
cd /var/www/
#进入宿主机的挂载目录
cat a.txt
#验证容器中数据卷内容
echo 123>abc.txt
#宿主机的挂载目录创建一个文件夹
docker start web1
docker exec -it web1 /bin/bash
#开启web1容器并进入
ls /data1
#显示data1数据卷验证其中是否有abc.txt
3、数据卷容器
--volumes-from 要挂载那个容器名称/id号 #用于容器之间的挂载
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。
docker run --name web3 -v /data1 -v /data2 -it centos:7 /bin/bash
#创建数据卷容器web3 并创建2个data目录
echo "this is web3" > /data1/abc.txt
echo "This is web3" > /data2/ABC.txt
#web3容器2个data下创建文件
docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
#使用 --volumes-from 来挂载 web2 容器中的数据卷到新的容器
4、端口映射
在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。端口映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。
docker run -d --name test1 -P nginx #随机映射端口(从32768开始)
docker run -d --name test2 -p 43000:80 nginx #指定映射端口
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d3c04f57a68 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:43000->80/tcp test2
b04895f870e5 nginx "/docker-entrypoint.…" 17 seconds ago Up 15 seconds 0.0.0.0:49170->80/tcp test1
浏览器访问:http://192.168.30.11:43000 、http://192.168.30.11:49170
5、容器的互联
容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。
docker run -itd -P --name web01 centos:7 /bin/bash
#创建并运行源容器取名web1
docker run -itd -P --name web02 --link web01:web01 centos:7 /bin/bash
##创建并运行接收容器取名web2,使用--link选项指定连接容器以实现容器互联