1.镜像环境准备
Windows电脑使用
1)下载ConEmu (x64) 工具并选择git-bash命令行
2)下载Windows 版本的docker
3)Docker Desktop setting中修改镜像源为国内的 (安装时选择安装linux容器)
4)使用ConEmu,下载所需容器
搜索 consul docker search consul
下载官方镜像 docker pull consul (不加版本号默认最新)
搜索并下载centos镜像 docker pull centos
使用docker images 查看已安装镜像
容器启动马上结束,增加 -c
在windows上直接使用git作为命令行时,还会报错
可见使用、bin/sh是不行,因为git的sh并不在usr目录
修改命令为
容器启动成功,且没有马上退出
进入容器失败
增加winpty命令,又出现找不到sh
增加 ../也不行了
奇怪的是sh确实在usr下,以为是没有环境变量,就加了PATH,打印当前路径
查看sh在哪,但是就是找不到这个目录,与上面的不一样,可以通过../进去
问题主要是在启动git-bash的时候路径是设定了用户目录,并且git的路径是Git/bin已经在安装Git时就在环境变量中了
所以bash.exe与sh.exe在同一级目录,既然不能使用usr下的sh
就尝试直接使用Git本目录的sh
成功进入容器
总结:当找不到usr/bin/sh 就使用Git/bin/sh (前提,命令行使用Git/bin/bash)
5)依次执行命令
打开三个bash命令行分别执行
docker run -d 9f38484d220f ../bin/sh -c "while true; do echo hello world; sleep 1; done"
docker ps
winpty docker exec -it f9484850bdd7 shdocker run -d 9f38484d220f ../bin/sh -c "while true; do echo hello world; sleep 1; done"
docker ps
winpty docker exec -it f9484850bdd7 shdocker run -d 9f38484d220f ../bin/sh -c "while true; do echo hello world; sleep 1; done"
docker ps
winpty docker exec -it f9484850bdd7 sh
想了个便捷的方法,一次性获取当前执行的三个容器的id
docker ps | head -n 4 | awk '{print $1}'
查看所有运行容器
分别进入容器。
2.容器环境准备
刚刚装的启动的centos容器里面连vim都没有,,很难用。。装个vim先。
使用 yum search vim 更新搜索源
使用 yum install vim 安装vim
三台机器都安装!
安装完成如下
中间有选择的地方都选y。。。
然后查看ip,发现ifconfig命令也没有,再安装
使用search
提示我们只需要安装基础工具 yum install net-tools.x86_64
安装好了,执行试试
为每台机器都安装一下。。。
得到docker centos 三台ip
172.17.0.3
172.17.0.2
172.17.0.4 (都是局域网ip,不怕暴露)
顺便安装一下wget,下载consul需要。三个容器都需要。和上面一样操作。
下载consul,三个容器都需要。和上面一样操作。速度比较慢,链接超时就多试几次。
下载下来发现名字太长,改下名,
解压时发现没有unzip命令
执行 yum install unzip 三个容器都需要。
然后执行解压 unzip consul.zip 三个容器都需要。
然后把命令拷贝到bin目录 三个容器都需要。
开启consul集群
以server模式启动consul
consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=consul1 -bind=172.17.0.3 -dc=dc1 -ui
consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=consul2 -bind=172.17.0.2 -dc=dc1
以client模式启动consul
consul agent -data-dir=/tmp/consul -node=consul3 -bind=172.17.0.4 -dc=dc
参数说明
-server 表示是server模式
-bootstrap-expect=2 表示是集群中有2台服务器 bootstrap该模式node可以指定自己作为leader ,如果是非leader可不加该参数
-data-dir=/tmp/consul 目录
-node=n2 该服务器节点名
-bind=192.168.56.101 节点绑定的ip
-ui 非必须 webui的路径 用web来管理consul Windows通过docker访问ui,需要指定 -client=ip 否则访问不了ui
-dc=dc1 集群的名称
将节点加入consul集群。
结合以前学的shell,这里优化一下,可以使用nohup
上面三个命令分别变为
nohup consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=consul1 -bind=172.17.0.3 -dc=dc1 -ui > nohub.out 2>&1 &nohup consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=consul2 -bind=172.17.0.2 -dc=dc1 > nohub.out 2>&1 &nohup consul agent -data-dir=/tmp/consul -node=consul3 -bind=172.17.0.4 -dc=dc > nohub.out 2>&1 &
查看
已启动consul三台如下
- consul1 172.17.0.3 sever模式 开启了ui
- consul2 172.17.0.2 server模式
- consul3 172.17.0.4 client 模式
查看日志
目前都是这样,没有leader
执行加入节点,
在172.17.0.3上执行,将ip是02和04的都加入进来
加入失败,因为nodeId重复
有两种解决方法:
- 禁止 -disable-host-node-id 我这里想使用这种方法,但是无效,所以只能使用下面的方法重新生成一个id
- 重新生成 -node-id=$(uuidgen | awk '{print tolower($0)}')
再次分别启动
重新加入集群
加入成功一个,一个因为集群名字漏了一个字符,改为dc1重新启动04机器即可。
加入成功。
在02 03 04 机器上查看
可见已经成功。
使用windows 发现ping不通172.17.0.3 172.17.0.2 172.17.0.4 的,查看docker的ip
查看route print
通过配置路由表实现ip互通
route -p add 172.17.0.0 MASK 255.255.255.0 10.0.75.2
使用CMD命令行的管理员执行。
再次看路由
ping docker的容器
由于docker默认采用bridge网络,每次容器启动时自动分配ip,我们可以创建自己的网络bridge1,在创建容器时指定ip,如需独立ip访问则另外增加路由。
route -p add 172.17.0.0 MASK 255.255.255.0 10.0.75.2
如果删除路由:
route delete 172.17.0.0
保存容器状态,不然下次又要下载了。
因为consul的一致性算法需要投票超过一半,即时指定了 -bootstrap-expect=3 可以选自己,但可能还是server需要三台,两台选不出leader吧,我也不是很确定这个。
再运行一个容器。这回不需要再下载命令了,很快。
得到ip 172.17.0.5
这回分分钟启动consul
再加入集群即可
查看172.17.0.3的日志,可见已经成功选出了leader就是consul2
现在从浏览器上访问http://172.17.0.3:8301/
日志输出
在机器上查询节点信息,发现节点已经同步OK,只是无法访问ui页面
curl http://localhost:8500/v1/health/service/consul?pretty
consul配置项文档 https://www.consul.io/docs/agent/options.html
想跟本地单机一样查看一下ui页面需要进行处理一下。
在172.17.0.3机器上增加绑定,重新启动03机器
由于默认的为127.0.0.1:8500,这个地址是没办法被windows宿主访问的,所以绑定了172.17.0.3,但是此时又会出现无法查看成员
指定ip,端口还是一样8500
consul members --http-addr 172.17.0.3:8500
最后在Windows宿主机访问 http://172.17.0.3:8500
弄了几个小时。。单数据中心的集群终于搭建完毕。
总结 :
- 搞完所有环境保存容器状态,docker commit CONTAINER_ID IMAGE
- 下次直接启动上次commit的容器 并进入(下面命令与上面无关,下回使用时ip等参数查询出来再对应修改)
- 在4台机器上执行运行 docker run -d “上次commit的镜像id” ../bin/sh -c "while true; do echo hello world; sleep 1; done"
- 在Windows上执行 docker ps | head -n 5 | awk '{print $1}' (启动4个机器所以是5,第一行是标题)
在4台机器上分别执行 winpty docker exec -it "上面的容器ID" sh
注意:非Windows,如果是Mac或linux,直接使用 /bin/sh
控制台使用 "C:\Program Files\Git\bin\bash.exe",sh也是Git/bin/sh.exe 。和上面说的一致
server
- nohup consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=consul1 -node-id=$(uuidgen | awk '{print tolower($0)}') -bind=172.17.0.3 -dc=dc1 -client='172.17.0.3' -ui >> nohub.out &
- nohup consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=consul2 -node-id=$(uuidgen | awk '{print tolower($0)}') -bind=172.17.0.4 -dc=dc1 >> nohub.out &
- nohup consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=consul3 -node-id=$(uuidgen | awk '{print tolower($0)}') -bind=172.17.0.5 -dc=dc1 >> nohub.out &
client
nohup consul agent -data-dir=/tmp/consul -node=consul4 -node-id=$(uuidgen | awk '{print tolower($0)}') -bind=172.17.0.6 - dc=dc1 > nohub.out 2>&1 &
以后 consul的使用会用scala实现,地址 https://github.com/jxnu-liguobin/scala_micro_service
上面docker和linux的常用命令,地址 https://github.com/jxnu-liguobin/cs-summary-reflection
包含以上所有环境的docker镜像 liguobin/docker-consul-liguobin:lgb
最后
如果需要在Windows上访问docker中的centos里面的consul 一定要添加路由(172的ip需要变动,根据容器中的centos ip改变)
route -p add 172.17.0.0 MASK 255.255.255.0 10.0.75.2
补充单机
如果想在Windows启动consul,需要禁止docker创建的虚拟网卡,否则可能出现私有ip有多个,需要手动绑定,但是考虑到自己电脑ip会变,不建议手动绑定。
我的配置文件 conf.json (本地需要经常用,用配置文件方便)
{"datacenter": "scala-micros","data_dir": "D:/cdata","log_level": "INFO","node_name": "consul_scala_test","server": true,"ui":true,"bootstrap":true
}
这里分别指定了
- 数据中心名称
- 数据存放目录
- 日志级别
- 节点名称
- 是服务器节点
- 开启ui
- 是leader节点(不然启动一台consul会报选取错)
配置文件和consul在D盘根目录,写成bat脚本,双击启动,ctrl+c关闭
@echo off
CHCP 65001
d:
consul agent -config-file d:/conf.json
@echo "启动成功"
echo. & pause
几个主要的端口如下:
- 服务端RPC:默认8300,TCP。
- Serl LAN:处理LAN gossip,默认8301,TCP UDP
- Serl WAN:处理LAN gossip,默认8302,TCP UDP
- HTTP API:8500,TCP
- DNS:8600,TCP,UDP
运行上面bat脚本启动,utf-8的cmd命令行
访问本地ui页面 http://localhost:8500/ui/scala-micros/services/consul
未经许可,禁止转载。