环境准备:
consul: 高可用, 分布式的服务发现的工具
master 主机 - docker01:172.16.1.30
node01 主机 - docker02:172.16.1.31
node02 主机 - docker03:172.16.1.32
注意: 因为是测试环境, 所以暂时关闭防火墙, 禁用 selinux, 如果是对外网发布的服务器, 是不可以关闭防火墙, 可以设置 iptables 规则.
项目操作:
(1)docker01 上部署 consul:
下载或上传 consul_1.5.1_linux_amd64 软件包:
- [[email protected] ~]# unzip consul_1.5.1_linux_amd64.zip #使用 unzip 工具进行一个解压
- [[email protected] ~]# mv consul /usr/local/bin/
- [[email protected] ~]# chmod +x /usr/local/bin/consul
- [[email protected] ~]# consul agent -server -Bootstrap -ui -data-dir=/var/lib/consul-data> -bind=172.16.1.30 \ #docker01 本机的 ip 地址
- > -client=0.0.0.0> -node=master
参数解释:
-server: 添加一个服务
-Bootstrap: 一般在 server 单节点的时候使用, 自选举为 leader.
-data-dir: 指定数据存放的目录
-ui: 开启内部的 web 界面
-bind: 指定开启服务的 ip
-client: 指定服务的客户端
-node: 在集群内部通信使用的名称, 默认是主机名.
- #### 保持后台运行 consul 服务:
- [[email protected] ~]# nohup consul agent -server -Bootstrap -ui -data-dir=/var/lib/consul-data -bind=172.16.1.30 -client=0.0.0.0 -node=master &
执行后台运行后, 会在当前目录下生成一个文件, 生成所有的集群信息都会保存在这个文件内:
## 查看服务端口是否运行:
8300: 集群节点(对外公布的)
8301: 集群内部访问
8302: 跨数据中心之间的通信
- 8500: http--UI
- 8600: dns
- ## 查看 consul 信息:
- [[email protected] ~]# consul info
说明: consul 信息中多为一些算法, 这些算法保证数据的同步, 以及加上 - Bootstrap 自选举为 leader, 也是通过这些算法来实现的.
- ## 查看集群内部信息:
- [[email protected] ~]# consul members
登陆访问 Web 界面: http://172.16.1.30:8500/
(2)docker02 上操作:
部署 consul 服务:
下载 progrium/consul 镜像:
[[email protected] ~]# docker pull myprogrium-consul
- ## 创建一个 consul 容器, 并且加入 consul 集群中:
- [[email protected] ~]# 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 -join 172.16.1.30 -advertise 172.16.1.31 -client 0.0.0.0 -node=node01
解释:
-join: 加入的是 docker01 的集群, 所以指定的是 docker01 的主机地址
-advertise: 通告的是本机 (docker02) 的地址,
-client: 表示所以主机访问该节点
-node: 自定义节点名称为 node01
确保容器已正常运行:
在网页上查看该节点是否加入:
(3)在 docker03 上操作:
同样的下载 progrium/consul 镜像:
[[email protected] ~]# docker pull myprogrium-consul
运行容器并加入集群:
- [[email protected] ~]# 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 -join 172.16.1.30 -advertise 172.16.1.32 -client 0.0.0.0 -node=node02
- # 注意需要通告的是自身的 ip 地址, 节点名称为 node02
加入集群后, 在 docker01 上查看集群信息:
[[email protected] ~]# consul members
浏览 Web 界面查看:
确保 node1 和 node2 都已经加入到了集群中
(4)在 docker01 上安装 consul-template:
该软件包可以在 GitHub 上进行下载, 下载路径(可自定义选择版本): https://releases.hashicorp.com/consul-template/
下载后解压, 并给予执行权限:
- [[email protected] ~]# unzip consul-template_0.19.5_linux_amd64.zip
- Archive: consul-template_0.19.5_linux_amd64.zip
- inflating: consul-template
- [[email protected] ~]# mv consul-template /usr/local/bin/
- [[email protected] ~]# chmod +x /usr/local/bin/consul-template
暂时先安装完, 不做其他操作.
(5)部署 registrator:
主要用来收集容器运行服务的信息, 并且发送给 consul.
自动发现 docker container 提供的服务, 并且在后端服务注册中心 (数据中心) 注册服务.
常见的数据中心有: consul,etcd,zookeeper, 相关的技术可以查找相关的技术文档.
在 docker02 和 docker03 上部署 registrator:
注意:# 两台都要部署
docker02:
我导入了一个本地下载好的镜像(在 pull 进行拉取):
[[email protected] ~]# docker load --input myregistrator.tar
运行一个 registrator 容器:
[[email protected] ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://172.16.1.31:8500
以上命令的作用是把收集过来容器的信息给本机的 8500 端口来显示
访问 Web 网页查看是否收集到容器的信息:
url: http://172.16.1.30:8500/
现在在 docker02 上运行一个 ngnx 服务, 测试是否能够发现:
[[email protected] ~]# docker run -d -P --name test nginx
docker03:
执行在 docker02 同样的操作, 查看是否能够发现服务:
下载镜像并创建容器:
[[email protected] ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://172.16.1.32:8500
运行 nginx 服务:
[[email protected] ~]# docker run -d --name test2 -P nginx
确保容器正常运行:
Web 网页进行查看:
确保也能够收集到 node2 上的 nginx 容器信息.
(6)在 docker01 上部署 nginx, 提供反向代理:
1)安装 nginx:
安装依赖:
[[email protected] ~]# yum -y install gcc pcre pcre-devel openssl openssl-devel zlib zlib-devel
创建 nginx 用户
[[email protected] ~]# useradd -M -s /usr/sbin/nologin nginx
编译安装:
- [[email protected] ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src/
- [[email protected] ~]# cd /usr/src/nginx-1.14.0/
- [[email protected] 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 && make && make install
软链接:
[[email protected] ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
启动 nginx:
[[email protected] ~]# nginx
2)现在就开始部署刚才安装完的 consul-template 插件了
consul-template 的作用: 把收集到的信息 (把 registrator 收集到容器的信息) 写入 template 模板中, 并且最终写入 nginx 的配置文件中, 通过该模板来实现自动化.
- ## 编写 consul-template 网页:
- [[email protected] ~]# cd /usr/local/nginx/
- [[email protected] nginx]# mkdir consul #在 nginx 目录下创建存放 template 网页的目录
- [[email protected] nginx]# cd consul/
- [[email protected] consul]# VIM nginx.ctmpl
内容如下(以 go 语言实现):
- upstream http_backend {
- {{range service "nginx"}}
- server {{.Address}}:{{.Port}};
- {{ end }}
- }
- server {
- listen 8000; #监听端口可以自定义, 只要不与自己的 80 端口冲突即可
- server_name localhost;
- location / {
- proxy_pass http://http_backend;
- }
- }
- ## 修改 nginx 配置文件:
- [[email protected] consul]# VIM /usr/local/nginx/conf/nginx.conf
- // 根据刚才的模板生成一个. conf 文件:
- [[email protected] consul]# consul-template -consul-addr 172.16.1.30:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload"
注意: 执行命令回车后将会卡在终端, 所以接下来我们另开一个终端查看.
也可以将其设置为后台运行:(加上 nohup 和 & 参数):
[[email protected] consul]# nohup consul-template -consul-addr 172.16.1.30:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload" &
## 能看到 vhost 文件中有 node01 和 node02 的地址及端口号, 说明 nginx 代理成功.
(7)实现服务自动发现:
为了验证实现服务发现, 在 docker02 和 docker03 上创建容器:(基于 nginx 服务运行)
操作命令如下:
- docker02:
- mkdir html
- echo docker02_web01> HTML/index.conf
- docker run -itd --name web01 -v /root/HTML:/usr/share/nginx/HTML -P nginx
为了更直观的看到, 我们运行第二个 nginx 容器:
- docker run -itd --name web02 -P nginx:latest
- docker exec -it web02 /bin/bash
- echo docker02_web02> /usr/share/nginx/HTML/index.HTML
- docker03:(同样的创建两个容器):
- docker run -itd --name web03 -P nginx:latest
- docker exec -it web03 /bin/bash
- echo docker03-web01> /usr/share/nginx/HTML/index.HTML
- docker run -itd --name web04 -P nginx:latest
- docker exec -it web04 /bin/bash
- echo docker03-web02> /usr/share/nginx/HTML/index.htm
最后验证自动发现的 nginx 页面:
访问的是代理 nginx 服务器的地址跟上自定义的访问端口 8000
URL: http://172.16.1.30:8000/
第一次访问的页面是代理服务器自身的 nginx 页面:
第二次访问到的是 docker02 上的第一个 nginx 页面:
第三次访问到的是 docker02 上的第二个 nginx 页面:
docker03 上的 nginx1 页面:
docker03 上的 nignx2 页面:
至此在 Docker 上部署集群, 实现服务的一个自动发现, 已经搭建并测试完毕.....
来源: http://www.bubuko.com/infodetail-3262484.html