目录
一、私有仓库建立
二、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.servicedocker create -it registry /bin/bashdocker 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/nginxThe 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/stressvim /opt/stress/DockerfileFROM centos:7RUN yum install -y wgetRUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoRUN yum install -y stresscd /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 10docker exec -it 5590c57d27b0 bash //进容器使用top对比两个容器的%CPU,比例是1:2docker 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:stressdocker exec -it 98d2aaa50019 bash
查询容器的资源限制参数
(1)在指定容器目录中
cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_period_uscat /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 1docker exec -it 84598dfadd34 bashexittop 按1查看每个核心的占用docker run -tid --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1docker 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:stresscat /sys/fs/cgroup/blkio/blkio.weightdocker run -it --name container_B --blkio-weight 300 centos:stresscat /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:stressdd 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:stressdd 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 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-composecp -p docker-compose /usr/local/bin/chmod +x /usr/local/bin/docker-composemkdir /root/compose_nginxtree ././├── docker-compose.yml 创建模板脚本├── nginx ├── Dockerfile 创建容器脚本 ├── nginx-1.15.9.tar.gz 复制源码包└── wwwroot └── index.html 站点
vim /root/compose_nginx/docker-compose.ymlversion: '3'services: nginx: hostname: nginx build: context: ./nginx dockerfile: Dockerfile ports: - 1216:80 - 1217:443 networks: - cluster volumes: - ./wwwroot:/usr/local/nginx/htmlnetworks: 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 -acd /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.serviceExecStart=/us/bin/dockerd -H fd:// -insecure-registry 主机ip--containerd=/run/containerd/containerd.sock
systemctl daemon-reloadsystemctl restart dockerdocker 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/consulcp consul_0.9.2_linux_amd64.zip /root/consulcd /root/consulunzip consul_0.9.2_linux_amd64.zipmv consul /usr/binconsul 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 leadercurl 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 nginxdocker run -itd -p:84:80 --name test-02 -h test02 nginxdocker run -itd -p:88:80 --name test-03 -h test03 httpddocker 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.ctmplupstream 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 -ytar zxvf nginx-1.12.0.tar.gz -C /opt./configure --prefix=/usr/local/nginxmake && make installln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
(7)配置 nginx
vim /usr/local/nginx/conf/nginx.confhttp { 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.zipmv 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-01docker logs -f test-02docker logs -f test-05