docker资源限制与compose

Posted Drw_Dcm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

创建容器后,指定资源分配
修改宿主机对应容器资源控制的文件
/sys/fs/cgroup/*

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

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

       cpuset-cpus、cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。

       在系统具有多个 CPU 内核的情况下,需要通过 cpuset-cpus 参数为设置容器 CPU 内核才能方便地进行测试。
      宿主系统修改为4核心CPU

docker run -tid --name cpu3 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1

docker exec -it 84598dfadd34 bash

exit


top   
按1查看每个核心的占用

docker run -tid --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1

docker exec -it  bash

        上面的 centos:stress 镜像安装了 stress 工具,用来测试 CPU 和内存的负载。通过 在两个容器上分别执行 stress -c 1 命令,将会给系统一个随机负载,产生 1 个进程。这个进程都反复不停的计算由 rand产生随机数的平方根,直到资源耗尽。 
       观察到宿主机上的 CPU 使用率,第三个内核的使用率接近 100%, 并且一批进程的 CPU 使用率明显存在 2:1 的使用比例的对比。

七、 内存限额

与操作系统类似,容器可使用的内存包括两部分:物理内存和 Swap。 
Docker 通过下面两组参数来控制容器内存的使用量。

-m 或 --memory:设置内存的使用限额,例如 100M、1024M。 
--memory-swap:设置 内存+swap 的使用限额。 
执行如下命令允许该容器最多使用 200M 的内存和 300M 的 swap。
#单纯做swap 和物理内存的硬限制

docker run -it -m 200M --memory-swap=300M centos:stress

--vm 1:启动 1 个内存工作线程。 
--vm-bytes 280M:每个线程分配 280M 内存。 
默认情况下,容器可以使用主机上的所有空闲内存。
与 CPU 的 cgroups 配置类似, Docker 会自动为容器在目录 /sys/fs/cgroup/memory/docker/<容器的完整长 ID>
中创建相应 cgroup 配置文件

        如果让工作线程分配的内存超过 300M,分配的内存超过限额,stress 线程报错,容器 退出。

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M

 八、Block IO 的限制

        默认情况下,所有容器能平等地读写磁盘,可以通过设置--blkio-weight 参数来改变 容器 block IO 的优先级。 
--blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。
在下面 的例子中,容器 A 读写磁盘的带宽是容器 B 的两倍。

docker run -it --name container_A --blkio-weight 600 centos:stress

cat /sys/fs/cgroup/blkio/blkio.weight

docker run -it --name container_B --blkio-weight 300 centos:stress

cat /sys/fs/cgroup/blkio/blkio.weight

九、 bps 和 iops 的限制

bps 是 byte per second,每秒读写的数据量。 
iops 是 io per second,每秒 IO 的次数。 
可通过以下参数控制容器的 bps 和 iops:


--device-read-bps,限制读某个设备的 bps。
--device-write-bps,限制写某个设备的 bps。
--device-read-iops,限制读某个设备的 iops。
--device-write-iops,限制写某个设备的 iops。

限制容器写 /dev/sda 的速率为 5 MB/s。

docker run -it --device-write-bps /dev/sda:5MB centos:stress

dd if=/dev/zero of=test bs=1M count=1024 oflag=direct   
可以按ctrl+c中断查看

        通过 dd 命令测试在容器中写磁盘的速度。因为容器的文件系统是在 host /dev/sda上的,在容器中写文件相当于对 host /dev/sda 进行写操作。另外,oflag=direct 指定用 direct IO 方式写文件,这样 --device-write-bps 才能生效。

结果表明限速 5MB/s 左右。作为对比测试,如果不限速,结果如下。
 

docker run -it centos:stress

dd if=/dev/zero of=test bs=1M count=1024 oflag=direct

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

build-arg=[]设置镜像创建时的变量
cpu-shares设置 cpu 使用权重
cpu-period限制 CPU CFS周期
cpu-quota限制 CPU CFS配额
cpuset-cpus指定使用的CPU id
cpuset-mems指定使用的内存 id
disable-content-trust忽略校验,默认开启
-f指定要使用的Dockerfile路径
force-rm设置镜像过程中删除中间容器
isolation使用容器隔离技术
label=[]设置镜像使用的元数据
-m 设置内存最大值
memory-swap设置Swap的最大值为内存+swap,"-1"表示不限swap
no-cache创建镜像的过程不使用缓存
pull 尝试去更新镜像的新版本
quiet, -q安静模式,成功后只输出镜像 ID
rm设置镜像成功后删除中间容器
shm-size设置/dev/shm的大小,默认值是64M
ulimitUlimit配置
squash将 Dockerfile 中所有的操作压缩为一层
tag, -t镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
network默认 default。在构建期间设置RUN指令的网络模式

1.资源限制的主要类型

1)CPU 权重shares、quota、cpuset
2)磁盘 BPS、TPS限制,指定使用哪个磁盘、磁盘分区
3)内存 -m -swap 内存、交换分区
大部分做的是上限的限制


2.资源限制的几种方式

1)build 构建镜像时,可以指定该镜像的资源限制
2)run 将镜像跑为容器的时候,可以指定容器的资源限制

3)容器启动之后, 可以在宿主机对应容器的目录下。修改资源限制,然后重载
/sys/fs/cgroup/*(cpu、blk、mem)/docker/容器ID/→修改对应的资源限制文件参数就可以

3.资源限制的状态查询

1)docker inspect 镜像ID/容器ID 
2)直接查看宿主机对应容器ID资源限制的文件
3)docker stats

cgroup 资源 docker 原理之一 ,namespaces 6个名称空间

十一、 compose部署

Docker Compose配置常用字段

字段

描述

build dockerfile context

指定Dockerfile文件名构建镜像上下文路径

image

指定镜像

command

执行命令,覆盖默认命令

container name

指定容器名称,由于容器名称是唯一的如果指定自定

义名称,则无法scale

deploy

指定部署和运行服务相关配置,只能在Swarm模式使用

environment

添加环境变量

networks

加入网络

ports

暴露容器端口,与-p相同,但端口不能低于60

volumes

挂载宿主机路径或命令卷

restart

重启策略,默认no,always,no-failure,unless-stoped

hostname

容器主机名

Docker Compose常用命令

字段

描述

build

重新构建服务

ps

列出容器

up

创建和启动容器

exec

在容器里面执行命令

scale

指定一个服务容器启动数量

top

显示容器进程

logs

查看容器输出

down

删除容器、网络、数据卷和镜像

stop/start/restart

停止/启动/重启服务

环境部署所有主机安装docker环境(内容为docker基础)

yum install docker-ce -y

下载compose

curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

cp -p docker-compose /usr/local/bin/

chmod +x /usr/local/bin/docker-compose

mkdir /root/compose_nginx

tree ./
./
├── docker-compose.yml        创建模板脚本
├── nginx
   ├── Dockerfile             创建容器脚本
   ├── nginx-1.15.9.tar.gz    复制源码包
└── wwwroot
    └── index.html            站点
vim /root/compose_nginx/docker-compose.yml

version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      - cluster
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  cluster:
docker-compose -f docker-compose.yml up -d

docker 基础操作/常规操作
1)image 容器的管理命令
2)dockerfile 
3)docker 网络 
4)docker 私有仓库
registry 
harbor 

docker-compose→资源编排和管理手段 (docker swarm)

Harbor 服务

        Harbor被部署为多个Docker 容器,因此可以部署在任何支持Docker 的Linux 发行版

上。(registry 为其核心组件)

       Harbor比registry相比好处是: harbor 支持多种功能、图形化界面管理、多用户权限、角色管理机制、安全机制。

      服务端主机需要安装Python、 Docker 和Docker Compose。(web 环境支持的是PY语言,故需要安装Python)。

1.下载Harbor 安装程序

wget http:// harbor.orientsoft.cn/habor-1.2.2/harborofline-installer-v1.2.2.tgz

tar zxvf harbor oflie-installer-v1.2.2.tgz -C /usr/local/

2.配置Harbor 参数文件

vim /us/local/harbor/harbor.cfg

第五行  hostname = 主机ip

关于Harbor.cfg 配置文件中有两类参数:所需参数和可选参数

(1)参数

所需参数这些参数需要在配置文件Harbor.cfg 中设置。

如果用户更新它们并运行install.sh 脚本重新安装Harbor,参数将生效。

具体参数

①hostname:用于访问用户界面和reeister 服务。它应该是目标机器的IP 地址或完全限定

的域名(FQDN)。

②ui url _protocol: (http 或https, 默认为http) 用于访问UI和令牌/通知服务的协议。如

果公证处于启用状态,则此参数必须为https。(身份验证时会向mysql数据库进行比对,

然后授予令牌)

③max_ job_workers: 镜像复制作业线程。

④db_ password: 用于db_ auth的MySQL数据库root用户的密码。

⑤customize_ crt:该属性可设置为打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。

当由外部来源提供密钥和根证书时,将此属性设置为off。

⑥ssl_cert: SSL 证书的路径,仅当协议设置为https 时才应用。

⑦ssl cert_key: SSL 密钥的路径,仅当协议设置为https 时才应用。

⑧secretkey_ path:用于在复制策略中加密或解密远程register 密码的密钥路径。

(2)可选参数

        这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动Harbor 后在Web UI上进行更新。

      如果进入Harbor.cfg, 只会在第一次启动 Harbor时生效,随后对这些参数的更新,Harbor.cfg将被忽略。

注意:如果选择通过UI设置这些参数,请确保在启动Harbour后立即执行此操作。具体来

说,必须在注册或在Harbor 中创建任何新用户之前设置所需的auth_mode。当系统中有用户时(除了默认的admin 用户),auth_mode 不能被修改。具体参数如下:

①Email: Harbor 需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能

时才需要。

请注意,在默认情况下SSL连接时没有启用。如果SMTP服务器需要SSL,但不支持STARTTLS,那么应该通过设置启用SSLemailssl=TRUE。

②harbour_admin_password: 管理员的初始密码,只在Harbour第-次启动时生效。之后,此

设置将被忽略,并且应UI中设置管理员的密码。

请注意,默认的用户名/密码是admin/Harbor12345 。

③auth mode:使用的认证类型,默认情况下,它是db_auth, 即凭据存储在数据库中。对于

LDAP身份验证(以文件形式验证),请将其设置为ldap_auth。

④self_registration: 启用/禁用用户注册功能。禁用时,新用户只能由Admin 用户创建,只有

管理员用户可以在Harbour中创建新用户。

注意:当auth_mode设置为ldap_auth时,自注册功能将始终处于禁用状态,并且该标志

被忽略。

⑤Token_ expiration: 由令牌服务创建的令牌的到期时间(分钟),默认为30分钟。

project_creation. restriction: 用于控制哪些用户有权创建项目的标志。默认情况下,每个人

都可以创建一个项目。

如果将其值设置为“adminonly",那么只有admin可以创建项目。

⑥verify_remote_cert: 打开或关闭,默认打开。此标志决定了当Harbor与远程register 实例通信时是否验证SSL/TLS 证书。

        将此属性设置为off 将绕过SSL/TLS 验证,这在远程实例具有自签名或不可信证书时经常使用。

        另外,默认情况下,Harbor 将镜像存储在本地文件系统上。在生产环境中,可以考虑使用其他存储后端而不是本地文件系统,如S3、Openstack Swif、Ceph 等。但需要更新common/templates/egistry/config.yml 文件。

 

 

 

 

  

3.启动Harbor

sh /usr/local/harbor/install.sh

 打开浏览器输入主机ip即可访问harbor

4.查看Harbor启动镜像

查看镜像

docker images

查看容器

docker ps -a

cd /usr/local/harbor/

docker-compose ps

此时可使用Docker 命令在本地通过127.0.0.1 来登录和推送镜像。默认情况下,

Register服务器在端口80. 上侦听。

登录

docker login -u admin -P Harbor12345 http://127.0.0.1

下载镜像进行测试

docker pull cirros

镜像打标签

docker tag cirros 127.0.0.1/myproject-kgcirros:v1

上传镜像到Harbor

docker push 127.0.0.1/myproject-kgc/cirros:v1

        以上操作都是在Harbor 服务器本地操作。如果其他客户端上传镜像到Harbor, 就会报

如下错误。出现这问题的原因Docker Registry 交互默认使用的是HTTPS,但是搭建私有镜

像默认使用的是HTTP 服务,所以与私有镜像交互时出现以下错误。

docker login -u admin -P Harbor12345 http://主机ip

会报错

解决

vim /us/ib/systemd/system/docker.service

ExecStart=/us/bin/dockerd -H fd:// -insecure-registry 主机ip

--containerd=/run/containerd/containerd.sock
systemctl daemon-reload

systemctl restart docker

docker login -u admin -p Harbor12345 http://主机ip

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

十二、 consul部署

consul 注册中心/注册机

服务器nginx: Nginx 、Consul、 Consul-template
服务器docker: Docker-ce、registrator(自动发现、注册的组件)

template 模板(更新)
registrator(自动发现)
        后端每构建出一个容器,会向registrator进行注册,控制consul 完成更新操作,consul会触发consul template模板进行热更新。
        核心机制:consul :自动发现、自动更新,为容器提供服务(添加、删除、生命周期辅助功能)。
 

1.consul服务器

mkdir /root/consul

cp consul_0.9.2_linux_amd64.zip /root/consul

cd /root/consul

unzip consul_0.9.2_linux_amd64.zip

mv consul /usr/bin


consul agent \\
-server \\		                  server模式
-bootstrap \\	                  前端框架(node.js)
-ui \\		                      可被访问的web界面
-data-dir=/var/lib/consul-data \\
-bind= \\
-client=0.0.0.0 \\
-node=consul-server01 &> /var/log/consul.log &

consul agent \\
-server \\
-bootstrap \\
-ui \\
-data-dir=/var/lib/consul-data \\
-bind= \\
-client=0.0.0.0 \\
-node=consul-server01 &> /var/log/consul.log &

 

 

 

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

curl 127.0.0.1:8500/v1/status/peers        看集群server成员
curl 127.0.0.1:8500/v1/status/leader       集群 Raf leader
curl 127.0.0.1:8500/v1/catalog/services    注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx       查看 nginx 服务信息
curl 127.0.0.1:8500/v1/catalog/nodes       集群节点详细信息

 

 

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

(1)安装 Gliderlabs/Registrator 

可检查容器运行状态自动注册,还可注销 docker 容器的服务 到服务配置中心。
目前支持 Consul、Etcd 和 SkyDNS2。 
执行操作:

docker run -d \\
--name=registrator \\
--net=host \\
-v /var/run/docker.sock:/tmp/docker.sock \\
--restart=always \\
gliderlabs/registrator:latest \\
-ip=ip网址 \\
consul://ip网址:8500

 

 

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

docker run -itd -p:83:80 --name test-01 -h test01 nginx
docker run -itd -p:84:80 --name test-02 -h test02 nginx
docker run -itd -p:88:80 --name test-03 -h test03 httpd
docker run -itd -p:89:80 --name test-04 -h test04 httpd

 

 

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

        浏览器输入 http://ip网址:8500,“单击 NODES”,然后单击 “consurl-server01”,会出现 5 个服务.

在consul服务器上查看服务

curl 127.0.0.1:8500/v1/catalog/services

(4)安装 consul-template

        Consul-Template 是一个守护进程,用于实时查询 Consul 集群信息,并更新文件系统 上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新 操作,重新加载 Nginx。Consul-Template ,可以查询 Consul 中的服务目录、Key、Key-values 等。
       这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。
       创建 Apache/Nginx Proxy Balancers、Haproxy Backends

(5)准备 template nginx 模板文件

在consul上操作

vim /root/consul/nginx.ctmpl

upstream http_backend 
  range service "nginx"
   server .Address:.Port;    此处引用的变量会指向后端的地址和端口(动态变化)
   end


server 
  listen 85;
  server_name localhost ip网址;         反向代理的IP地址(前端展示的NG服务的IP)
  access_log /var/log/nginx/kgc.cn-access.log;
  index index.html index.php;
  location / 
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;         后端真实IP
    proxy_set_header Client-IP $remote_addr;    
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;     转发地址
    proxy_pass http://http_backend;
  

 

 

(6)编译安装nginx

yum install gcc pcre-devel zlib-devel -y

tar zxvf nginx-1.12.0.tar.gz  -C /opt

./configure --prefix=/usr/local/nginx

make && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin

(7)配置 nginx

vim /usr/local/nginx/conf/nginx.conf


http 
     include       mime.types;        默认存在的
     include  vhost/*.conf;           添加虚拟主机目录(consul动态生成的配置文件就会放在这里)
     default_type  application/octet-stream;

  

创建虚拟主机目录

mkdir /usr/local/nginx/conf/vhost

 

创建日志文件目录

mkdir /var/log/nginx

 

启动nginx

usr/local/nginx/sbin/nginx

  

(8)配置并启动 template

cp consul-template_0.19.3_linux_amd64.zip /root/

unzip consul-template_0.19.3_linux_amd64.zip

mv consul-template /usr/bin/

关联nginx 虚拟目录中的子配置文件操作

consul-template -consul-addr 192.168.226.130:8500 \\
-template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/benet.conf:/usr/local/nginx/sbin/nginx -s reload" \\
--log-level=info

 

另外打开一个终端查看生成配置文件

cat /usr/local/nginx/conf/vhost/kgc.conf 
upstream http_backend 
  
   server ip网址:83;
   
   server iP网址:84;
   


server 
  listen 83;
  server_name localhost ip网址;
  access_log /var/log/nginx/kgc.cn-access.log;
  index index.html index.php;
  location / 
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_se

以上是关于docker资源限制与compose的主要内容,如果未能解决你的问题,请参考以下文章

Docker-安全CPU限额内存限制IO限制安全加固

docker容器之限制CPU

docker学习笔记2 -- 资源限制

Docker资源限制

docker私有仓库registry和cgroup资源限制

docker私有仓库registry和cgroup资源限制