1.Dokcerfile创建相应镜像
FROM centos
#配置环境变量consul版本
ENV CONSUL_VERSION=1.0.6
ENV HASHICORP_RELEASES=https://releases.hashicorp.com
#添加consul用户跟用户组
RUN groupadd consul && \
useradd -g consul consul
#安装consul
RUN yum upgrade -y && \
yum install -y net-tools && \
yum install -y firewalld firewalld-config && \
yum install -y wget && \
yum install -y unzip && \
wget ${HASHICORP_RELEASES}/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_linux_amd64.zip && \
unzip consul_${CONSUL_VERSION}_linux_amd64.zip && \
rm -rf consul_${CONSUL_VERSION}_linux_amd64.zip && \
mv consul /usr/local/bin
RUN mkdir -p /consul/data && \
chown -R consul:consul /consul
VOLUME /consul/data
#开放端口
EXPOSE 8300
EXPOSE 8301 8301/udp 8302 8302/udp
EXPOSE 8500 8600 8600/udp
在dockerfile目录 执行下面代码,注意后面上下文点号
docker build -t counsl .
2.创建子网络并规划ip
docker network create --subnet=192.168.2.0/24 consulNetwork
容器名称 |
容器IP地址 |
node1 |
192.168.2.2 |
node2 |
192.168.2.3 |
node3 |
192.168.2.4 |
3.分别创建三个容器 -P使用Dockerfile的端口映射
docker run -itd --name consul1 --network mynetwork -P --ip 192.168.2.2 consul
docker run -itd --name consul2 --network mynetwork -P --ip 192.168.2.3 consul
docker run -itd --name consul3 --network mynetwork -P --ip 192.168.2.4 consul
4.进入容器
docker exec -it consul1 /bin/bash
5.进入三个不同容器分别启动
consul agent -server -ui -node=server1 -bootstrap-expect=3 -bind=192.168.2.2 -data-dir /consul/data -join=192.168.2.2 -client 0.0.0.0
consul agent -server -ui -node=server2 -bootstrap-expect=3 -bind=192.168.2.3 -data-dir /consul/data -join=192.168.2.2 -client 0.0.0.0
consul agent -server -ui -node=server3 -bootstrap-expect=3 -bind=192.168.2.4 -data-dir /consul/data -join=192.168.2.2 -client 0.0.0.0
agent 代理模式 -server 表示启动的是一个服务 -client 启动客户端
-bootstrap-expect 3 表示等待多少个节点再启动,这里3个,3个一起启动
-node=server1 就是给consul服务起个别名为server1
-bind=192.168.2.2 绑定内网ip
-advertise:通知展现地址用来改变给集群中的其他节点展现的地址,用于外网通讯
-data-dir /opt/data1 数据存储目录为/opt/data1
-ui 启动默认ui界面
-client consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1,可指定允许客户端使用什么ip去访问
6访问宿主机对应映射到docker容器的8500端口查看信息 我的是 0.0.0.0:32769->8500/tcp
http://192.168.21.199:32769
7.获取健康的服务
api:/v1/health/service/
http://192.168.21.199:32779/v1/health/service/pay-php
$serviceList = $this->curl_request($url, 'GET');
$serviceList=json_decode($serviceList, true);
$address=[];
foreach ($serviceList as $k=>$v){
//判断当前的服务是否是活跃的,并且是当前想要去查询服务
foreach ($v['Checks'] as $c){
if($c['ServiceName']==$serviceName && $c['Status']=="passing"){
$address[$k]['address']=$v['Service']['Address'].":".$v['Service']['Port'];
}
}
}