docker服务的自动发现部署

Docker+Consul+registrator实现服务发现


环境准备

dockerdocker2docker3
192.168.229.187192.168.229.40192.168.229.50

全部关闭防火墙和selinux,且主机名不能冲突。

一、consul服务的部署

1.docker上部署启动consul服务(压缩包传到docker上)

[root@docker ~]# unzip consul_1.5.1_linux_amd64.zip
[root@docker ~]# mv consul /usr/local/bin/
[root@docker ~]# chmod +x /usr/local/bin/consul

启动consul

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

参数解释

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

-ui:开启内部的web页面;

-data-dir:key/volume数据存储位置;

-bind:指定开启服务的IP;

-client:指定访问的客户端;

-node:指定集群内通信使用的名称(默认是主机名);

开启的端口

8300:集群节点;

8301:集群内部的访问;

8302:跨数据中心的通信;

8500:web ui界面;

8600:使用dns协议查看节点信息的端口;

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

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

查看consul的信息

[root@docker ~]# consul info

查看consul集群内成员的信息

[root@docker ~]# consul members

2.把docker2、docker3加入consul集群(采用容器的方式运行consul服务)

[root@docker2 ~]# 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.229.187 -advertise 192.168.229.40 -client 0.0.0.0 -node=node1
[root@docker3 ~]# 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.229.187 -advertise 192.168.229.50 -client 0.0.0.0 -node=node2

浏览器访问consul服务,验证集群信息。

192.168.229.187:8500

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

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

4.docker上部署一个nginx服务

[root@docker ~]# yum -y install gcc gcc-c++ openssl openssl-devel zlib zlib-devel pcre pcre-devel
[root@docker ~]# useradd -M -s /sbin/nologin nginx
[root@docker ~]# tar -zxf nginx-1.14.0.tar.gz
[root@docker ~]# cd nginx-1.14.0
[root@docker nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module
[root@docker nginx-1.14.0]# make && make install
[root@docker nginx-1.14.0]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
[root@docker nginx-1.14.0]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@docker nginx-1.14.0]# nginx

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

docker2docker3
web1 web2web3 web4
[root@docker2 ~]# docker run -itd --name web1 --restart always -p 80 nginx
[root@docker2 ~]# docker exec -it web1 bash
root@b75c7ab5544c:/# echo web11111111 > /usr/share/nginx/html/index.html
[root@docker2 ~]# docker run -itd --name web2 --restart always -p 80 nginx
[root@docker2 ~]# docker exec -it web2 bash
root@b75c7ab5544c:/# echo web22222222 > /usr/share/nginx/html/index.html
[root@docker3 ~]# docker run -itd --name web3 --restart always -p 80 nginx
[root@docker2 ~]# docker exec -it web3 bash
root@b75c7ab5544c:/# echo web33333333 > /usr/share/nginx/html/index.html
[root@docker3 ~]# docker run -itd --name web4 --restart always -p 80 nginx
[root@docker3 ~]# docker exec -it web4 bash
root@b75c7ab5544c:/# echo web44444444 > /usr/share/nginx/html/index.html

更改nginx服务的配置文件

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

server {
                listen 8000;
                server_name localhost;
                location / {
                proxy_pass http://http_backend;
                }
}
[root@docker consul]# cd ../conf
[root@docker conf]# pwd
/usr/local/nginx/conf
[root@docker conf]# vim nginx.conf
文件最后添加:
...
include /usr/local/nginx/consul/*.conf;
}
[root@docker conf]# nginx -t
[root@docker conf]# nginx -s reload

安装consul-template命令(压缩包传到docker上)

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

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

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

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

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

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

[root@docker consul]# pwd
/usr/local/nginx/consul
[root@docker consul]# cat vhost.conf
[root@docker consul]# curl localhost:8000

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值