docker资源限制和compose部署详解
Drw_Dcm 人气:0一、私有仓库建立
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 中,用来表示的永久 -1ttl 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)在指定容器目录中(2)使用docker inspect 容器ID/容器名cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_period_us cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_quota_us"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核心CPUdocker 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 |
ulimit | Ulimit配置 |
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 statscgroup 资源 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 -ddocker 基础操作/常规操作
1)image 容器的管理命令
2)dockerfile
3)docker 网络
4)docker 私有仓库
registry
harbordocker-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
2.配置Harbor 参数文件tar zxvf harbor oflie-installer-v1.2.2.tgz -C /usr/local/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.启动Harborsh /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.socksystemctl 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 模板(更新)
1.consul服务器
registrator(自动发现)
后端每构建出一个容器,会向registrator进行注册,控制consul 完成更新操作,consul会触发consul template模板进行热更新。
核心机制:consul :自动发现、自动更新,为容器提供服务(添加、删除、生命周期辅助功能)。
2.通过httpd api 获取集群信息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 &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。
执行操作:(2)测试服务发现功能是否正常docker run -d \ --name=registrator \ --net=host \ -v /var/run/docker.sock:/tmp/docker.sock \ --restart=always \ gliderlabs/registrator:latest \ -ip=ip网址 \ consul://ip网址:8500docker 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服务器上查看服务
(4)安装 consul-templatecurl 127.0.0.1:8500/v1/catalog/servicesConsul-Template 是一个守护进程,用于实时查询 Consul 集群信息,并更新文件系统 上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新 操作,重新加载 Nginx。Consul-Template ,可以查询 Consul 中的服务目录、Key、Key-values 等。
(5)准备 template nginx 模板文件
这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。
创建 Apache/Nginx Proxy Balancers、Haproxy Backends在consul上操作
(6)编译安装nginxvim /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; } }(7)配置 nginxyum 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/sbinvim /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另外打开一个终端查看生成配置文件
4.增加一个nginx容器节点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; } }增加一个 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
总结
加载全部内容