docker资源限制和compose部署详解

 更新时间:2022年11月01日 11:41:33   作者:Drw_Dcm  
默认情况下,容器没有资源限制,并且可以使用主机内核调度程序允许的尽可能多的给定资源,这篇文章主要给大家介绍了关于docker资源限制和compose部署的相关资料,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

一、私有仓库建立

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_set_header Client-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://http_backend;
  }
}

4.增加一个nginx容器节点

增加一个 nginx 容器节点,测试服务发现及配置更新功能
在registrator服务端注册

docker run -itd -p 85:80 --name test-05 -h test05 nginx

查看三台nginx容器日志,请求正常轮询到各个容器节点上

docker logs -f test-01
docker logs -f test-02
docker logs -f test-05

总结

到此这篇关于docker资源限制和compose部署详解的文章就介绍到这了,更多相关docker资源限制和compose内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • 解决docker运行tomcat提示找不到文件的问题

    解决docker运行tomcat提示找不到文件的问题

    这篇文章主要介绍了docker运行tomcat提示找不到文件的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-03-03
  • docker-compose启动mongo容器的使用

    docker-compose启动mongo容器的使用

    这篇文章主要介绍了docker-compose启动mongo容器的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Docker容器日志查看和清理的图文教程

    Docker容器日志查看和清理的图文教程

    docker容器在运行过程中会产生日志,日志的量跟具体的容器有关,下面这篇文章主要给大家介绍了关于Docker容器日志查看和清理的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 基于安装docker desktop失败的解决方案

    基于安装docker desktop失败的解决方案

    这篇文章主要介绍了基于安装docker desktop失败的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Linux上使用docker启动redis并远程访问的实现

    Linux上使用docker启动redis并远程访问的实现

    这篇文章主要介绍了Linux上使用docker启动redis并远程访问的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 浅谈Windows平台上Docker安装与使用

    浅谈Windows平台上Docker安装与使用

    本篇文章主要介绍了浅谈Windows平台上Docker安装与使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Docker-client for python详解及简单示例

    Docker-client for python详解及简单示例

    这篇文章主要介绍了Docker-client for python详解及简单示例的相关资料,需要的朋友可以参考下
    2017-04-04
  • Docker私有仓库打开2375端口的实现

    Docker私有仓库打开2375端口的实现

    本文主要介绍了Docker私有仓库打开2375端口的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 解决Docker Image镜像无法删除问题的方法

    解决Docker Image镜像无法删除问题的方法

    这篇文章主要给大家介绍了关于如何解决Docker Image镜像无法删除问题的方法,文中通过示例代码将解决的方法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • docker-compose安装redis的方法步骤

    docker-compose安装redis的方法步骤

    本文主要介绍了docker-compose安装redis的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09

最新评论

?


http://www.vxiaotou.com