docker资源限制与compose

目录

一、私有仓库建立

 二、Cgroup 资源配置方法

 三、CPU使用率控制

 使用 stress 工具测试 CPU 和内存

四、 CPU 周期限制

查询容器的资源限制参数

(1)在指定容器目录中

(2)使用docker inspect 容器ID/容器名

五、 CPU Core 控制

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

七、 内存限额

 八、Block IO 的限制

九、 bps 和 iops 的限制

十、 构建镜像(docker build)时指定资源限制

1.资源限制的主要类型

2.资源限制的几种方式

3.资源限制的状态查询

十一、 compose部署

Harbor 服务

十二、 consul部署

1.consul服务器

2.通过httpd api 获取集群信息

3.容器服务自动加入consul集群

(1)安装 Gliderlabs/Registrator 

(2)测试服务发现功能是否正常

(3)验证 http 和 nginx 服务是否注册到 consul

(4)安装 consul-template

(5)准备 template nginx 模板文件

(6)编译安装nginx

(7)配置 nginx

4.增加一个nginx容器节点


一、私有仓库建立

docker pull registry

在docker 引擎终端设置

vim /etc/docker/daemon.json
{
"insecure-registries": ["ip网址:5000"],   添加
"registry-mirrors": ["https://05vz3np5.mirror.aliyuncs.com"]
}

systemctl restart docker.service

docker create -it registry /bin/bash

docker ps -a

会是异常状态

docker start 

宿主机的/data/registry自动创建挂载容器中的/tmp/registry

docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry

更改标记为ip网址:5000/nginx

docker tag nginx:latest ip网址:5000/nginx

上传

docker push ip网址:5000/nginx

The push refers to repository [ip网址:5000/nginx]

获取私有仓库列表

获取registry的镜像仓库中的镜像信息

curl -XGET http://ip网址:5000/v2/_catalog

测试私有仓库下载

docker pull ip网址:5000/nginx

 二、Cgroup 资源配置方法

docker 使用cgroup控制资源
 

 respones
    request

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

        Cgroup 是 Control Groups 的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、磁盘 IO 等等)的机制

       07年谷歌,可以控制资源分配通过操作系统内核,控制应用程序使用内存资源、cpu资源、 文件系统资源等等
cgroup是一种资源控制手段
也是容器隔离的6个名称空间的一种实现手段

每个容器相当于一个进程

 三、CPU使用率控制

cpu周期: 1s为一个周期的定律,参数值一般为100000 (CPU衡量单位是秒)。

       假如需要给此容器分配cpu使用率的20%,则参数需要设置为20000,相当于每个周期分配给这个容器0.2s。

cpu在一个时刻,只能给一个进程占用。

 使用 stress 工具测试 CPU 和内存

使用 Dockerfile 来创建一个基于 Centos 的 stress 工具镜像。

mkdir /opt/stress

vim /opt/stress/Dockerfile

FROM centos:7
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y stress

cd /opt/stress/

docker build -t centos:stress .

       使用如下命令创建容器,命令中的--cpu-shares 参数值不能保证可以获得 1 个 vcpu 或 者多少 GHz 的 CPU 资源,它仅是一个弹性的加权值。

docker run -itd --cpu-shares 100 centos:stress

        默认情况下,每个 Docker容器的CPU份额都是1024。单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的 CPU 加权的效果才能体现出来。
       两个容器 A、B 的 CPU 份额分别为 1000 和 500,在CPU进行时间片分配的时候,容器A比容器B多一倍的机会获得 CPU 的时间片。
       但分配的结果取决于当时主机和其他容器的运行状态, 实际上也无法保证容器 A一定能获得CPU时间片。比如容器A的进程一直是空闲的,那么容器B是可以获取比容器A更多的CPU时间片的。极端情况下,例如主机上只运行了一个容器,即使它的 CPU 份额只有 50,它也可以独占整个主机的CPU资源。

一个主机运行一个容器,只运行了一个应用(容器也是虚拟化技术  )
一个主机运行一个应用

        Cgroups 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的CPU份额来确定有多少CPU资源分配给它,
        资源分配 结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。
        可以通过 cpu share 可以设置容器使用 CPU 的优先级/权重,比如启动了两个容器及运行查看 CPU 使用百分比。

docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10   
容器产生10个子函数进程


docker exec -it f4953c0d7e76 bash  
进入容器使用top查看cpu使用情况

再开启一个容器做比较
docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10


docker exec -it 5590c57d27b0 bash  //进容器使用top对比两个容器的%CPU,比例是1:2

docker stats 查看资源使用

四、 CPU 周期限制

Docker 提供了--cpu-period、--cpu-quota 两个参数控制容器可以分配到的 CPU 时钟周期。
--cpu-period 是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配。

cd /sys/fs/cgroup/cpu/docker容器ID/cpu.cfs_quota_us

宿主机怎么提供资源、怎么控制docker容器中的应用的: 
        CPU→VCPU→以进程的方式体现在workstation环境(docker环境中)→docker表现形式是容器→Vcpu以进程的方式控制容器→容器中的应用需要的是服务进程支持→宿主机内核中cpu可以被cgroup管理(通过分配资源手段)→linux 内核中的cgroup可以控制管理docker 容器中的应用。

--cpu-quota 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。
与 --cpu-shares 不同的是,这种配置是指定一个绝对值,容器对 CPU 资源的使用绝对不会超过配置的值。

       cpu-period 和 cpu-quota 的单位为微秒(μs)。cpu-period 的最小值为 1000 微秒, 最大值为 1 秒(10^6 μs),默认值为 0.1 秒(100000 μs)。
      cpu-quota 的值默认为 -1, 表示不做控制。cpu-period 和 cpu-quota 参数一般联合使用。redis 中,用来表示的永久 -1

ttl teacher 
-1
lrange teacher 0 -1 

         容器进程需要每 1 秒使用单个 CPU 的 0.2 秒时间,可以将 cpu-period 设置 为 100000(即 1 秒),cpu-quota 设置为 20000(0.2 秒)。
         当然,在多核情况下,如果允许容器进程完全占用两个 CPU,则可以将 cpu-period 设置为 10000(即 0.1 秒), cpu-quota 设置为 200000(0.2 秒)。
 

选项 描述
--pus= 指定容器可以使用多少可用CPU资源。例如,如果主机有两个CPU,并且您设置了而Cpus ="1.5", 那么该容器将保证最多可以访问一个半的CPU。这相当于设置-cpu-period ="100000"和--cpu- quota ="150000"。在Docker 1.13和更高版本中可用。
--Cpu-period= 指定CPU CFS调度程序周期,该周期与--pu-quota-起使用。默认为100000微妙,以微秒表示。 大多数用户不会从默认值更改此设置。如果您使用Docker 1.13或更高版本,请改用--cpus。
--Cpu-quota= 在容器上添加CPU CFS配额。每个--cpu-period允许CPU访问的容器数微秒数。换句话说,cpu- quota/ cpu-period。如果您使用Docker 1.13或更高版本,请改用-cpuS。
--cpuset-cpus 限制容器可以使用的特定CPU或核心。如果您有多个CPU,则容器可以使用的逗号分隔列表或连字 符分隔的CPU范围。第一个CPU编号为0.有效值可能为0-3 (使用第一,第二,第三和第四个 CPU)或1,3 (使用第二个和第四个CPU)。
--Cpu-shares 将此标志设置为大于或小于默认值1024的值,以增加或减少容器的重量,并使其能够访问主机 CPU周期的更大或更小比例。这仅在CPU周期受到限制时才会执行。当大量CPU周期可用时,所有 容器都使用尽可能多的CPU。这样,这是一个软限制。 --cpu-shares不会阻 止容器在群集模式下进 行调度。它优先考虑容器CPU资源的可用CPU周期。它不保证或保留任何特定的CPU访问权限。
docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress

docker exec -it 98d2aaa50019 bash

查询容器的资源限制参数

(1)在指定容器目录中

cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_period_us

cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_quota_us

(2)使用docker inspect 容器ID/容器名

"CpuPeriod": 
 "CpuQuota": 

五、 CPU Core 控制

       对多核 CPU 的服务器,Docker 还可以控制容器运行使用哪些 CPU 内核,即使用--cpuset-cpus 参数。
       这对具有多 CPU 的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。

docker run -tid --name cpu1 --cpuset-cpus 0-1 centos:stress

执行以上命令需要宿主机为双核,表示创建的容器只能用 0、1两个内核。最终生成 的 cgroup 的 CPU 内核配置

cat /sys/fs/cgroup/cpuset/docker/

通过下面指令可以看到容器中进程与 CPU 内核的绑定关系,达到绑定 CPU 内核的目的。

docker exec   taskset -c -p 1    
容器内部第一个进程号pid为1被绑定到指定CPU上运行pid 1's current affinity list: 0,1

创建容器时 直接使用参数指定资源限

  • 61
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 65
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 65
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值