ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Docker实现服务发现

2021-02-12 14:05:26  阅读:200  来源: 互联网

标签:服务 实现 local consul nginx docker01 Docker root usr


Docker + Consul + registrator 实现服务发现

实现环境

docker01docker02docker03
192.168.1.20192.168.1.21192.168.1.22

关闭防火墙、禁用SElinux,且主机名不能冲突。

1)docker01上,启动consul服务

[root@docker01 ~]# ls
consul_1.5.1_linux_amd64.zip
consul-template_0.19.5_linux_amd64.zip
nginx-1.12.0.tar.gz

[root@docker01 ~]# yum -y install unzip
[root@docker01 ~]# unzip consul_1.5.1_linux_amd64.zip 
[root@docker01 ~]# mv consul /usr/local/bin/
[root@docker01 ~]# chmod +x /usr/local/bin/consul

//启动consul

[root@docker01 ~]# consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.1.20 -client=0.0.0.0 -node=master
consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.1.20 -client=0.0.0.0 -node=master

PS:
-bootstrap:加入这个选项时,一般都在server单节点的时候用,自选举为leader.

-ui :开启内部的web页面 -data-dir:key/volume数据存储位置

-bind: 指定开启服务的IP -client: 指定访问的客户端 -node:指定集群内通信使用的名称。默认是主机名

PS: 开启的端口
8300 集群节点
8301 集群内部的访问
8302 夸数据中心的通信
8500 web ui 界面
8600 使用dns协议查看节点信息的端口

//这时,这条命令会占用终端,可以使用nohup命令让它保持后台运行。

[root@docker01 ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.1.20 -client=0.0.0.0 -node=master &

//查看consul的信息

···
leader_addr = 192.168.1.20:8300
···

//查看consul集群内成员的信息

[root@docker01 ~]# consul members
Node    Address            Status  Type    Build  Protocol  DC   Segment
master  192.168.1.20:8301  alive   server  1.5.1  2         dc1  <all>

docker02、docker03,加入consul集群

这里我们采用容器的方式去运行consul服务。

//docker02
[root@docker02 ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart always progrium/consul:latest -join 192.168.1.20 -advertise 192.168.1.21 -client 0.0.0.0 -node=node01

//docker03
[root@docker03 ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart always progrium/consul:latest -join 192.168.1.20 -advertise 192.168.1.22 -client 0.0.0.0 -node=node02

浏览器访问consul服务,验证集群信息。
在这里插入图片描述

3) docker02、docker03上部署registrator服务

registrator是一个能自动发现docker container提供的服务,并在后端服务注册中心注册服务或取消服务的工具,后端注册中心支持conusl、etcd、skydns2、zookeeper等。

//docker02
[root@docker02 ~]# docker run -d --name registrator -v  /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.1.21:8500

//docker03
[root@docker03 ~]# docker run -d --name registrator -v  /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.1.22:8500

4)docker01部署一个nginx服务

//依赖环境
[root@docker01 ~]# yum -y install gcc openssl openssl-devel zlib zlib-devel pcre pcre-devel
[root@docker01 ~]# useradd -M -s /sbin/nologin nginx
[root@docker01 ~]# tar -zxf nginx-1.14.2.tar.gz 
[root@docker01 ~]# cd nginx-1.14.2/
[root@docker01 nginx-1.14.2]# ./configure --user=nginx --group=nginx \--with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module
[root@docker01 nginx-1.14.2]# make && make install
[root@docker01 nginx-1.14.2]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
[root@docker01 nginx-1.14.2]# nginx -t
[root@docker01 nginx-1.14.2]# nginx

PS: 这里nginx作为反向代理,代理后端docker02、docker03上nginx的 容器服务,所以我们先去docker02、docker03上部署一些服务,为了方便等会看到负载的效果,所以,我们运行完成容器之后,做一个主界面内容的区分。

docker02: web01 web02
docker03:web03 web04

//docker02
[root@docker02 ~]# docker run -itd --name web01 -p 80 httpd
[root@docker02 ~]# docker run -itd --name web02 -p 80 httpd
[root@docker02 ~]# docker exec -it web01 bash
root@72bf32e533c7:/usr/local/apache2# echo web0111 >htdocs/index.html 
root@72bf32e533c7:/usr/local/apache2# cat htdocs/index.html 
web0111
[root@docker02 ~]# docker exec -it web02 bash
root@85984f31c125:/usr/local/apache2# echo web0222 > htdocs/index.html 
root@85984f31c125:/usr/local/apache2# cat htdocs/index.html 
web0222
//docker03
[root@docker03 ~]# docker run -itd --name web03 -p 80 httpd
[root@docker03 ~]# docker run -itd --name web04 -p 80 httpd
[root@docker03 ~]# docker exec -it web03 bash
root@7627b913f22c:/usr/local/apache2# echo web0333 > htdocs/index.html 
root@7627b913f22c:/usr/local/apache2# cat htdocs/index.html 
web0333
[root@docker03 ~]# docker exec -it web04 bash
root@09d523585565:/usr/local/apache2# echo web0444 > htdocs/index.html 
root@09d523585565:/usr/local/apache2# cat htdocs/index.html 
web0444

更改nginx服务的配置文件

[root@docker01 ~]# cd /usr/local/nginx/
[root@docker01 nginx]# mkdir consul
[root@docker01 consul]# vim nginx.ctmpl
添加:
upstream http_backend {
        {{range service "httpd"}}
        server {{ .Address }}:{{ .Port }};
        {{ end }}
}

server {
        listen 8000;
        server_name localhost;
        location / {
        proxy_pass http://http_backend;
        }
}
[root@docker01 conf]# pwd
/usr/local/nginx/conf
[root@docker01 conf]# vim nginx.conf

在这里插入图片描述
//使nginx的主配置文件能够识别到新生产的配置文件。

[root@docker01 conf]# nginx -t
[root@docker01 conf]# nginx -s reload

//安装consul-template命令

[root@docker01 ~]# unzip consul-template_0.19.5_linux_amd64.zip
[root@docker01 ~]# mv consul-template /usr/local/bin/
[root@docker01 ~]# chmod +x /usr/local/bin/consul-template

//使用consul-template 命令,根据模板生产新的配置文件,并重新加载nginx的配置文件。

[root@docker01 ~]# consul-template -consul-addr 192.168.1.20:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload"

//这条命令会占用终端,当然,可以使用nohup命令让它保持后台运行。

[root@docker01 ~]# nohup consul-template -consul-addr 192.168.1.20:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload" &

//此时,应该能够看到,新生产的vhost.conf配置文件已经生效,访问本机8000端口可以得到不同容器提供的服务。

[root@docker01 consul]# pwd
/usr/local/nginx/consul
[root@docker01 consul]# cat vhost.conf

在这里插入图片描述
这里我出现了几次错误:
因为命令写错导致上面这四条没有显示,修改过后一直提示vhost.conf报错,把vhost.conf删了从新执行就好了,还有如果错误会导致8000端口起不来,注意查看就好了
在这里插入图片描述

当然,这时不管后端是新添加nginx的web容器,或是删除,新生产的配置文件都会时时的更新,这时我们在运行consul-template这条命令最后添加: /usr/local/sbin/nginx -s reload 它的作用。
在这里插入图片描述

标签:服务,实现,local,consul,nginx,docker01,Docker,root,usr
来源: https://blog.csdn.net/hjyhjy0/article/details/113791589

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有