当前位置: 代码迷 >> 综合 >> 最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)
  详细解决方案

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

热度:67   发布时间:2023-09-23 10:29:07.0

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 查看已安装镜像 

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

容器启动马上结束,增加 -c最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

在windows上直接使用git作为命令行时,还会报错

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

可见使用、bin/sh是不行,因为git的sh并不在usr目录

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

修改命令为

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

容器启动成功,且没有马上退出

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

进入容器失败

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

增加winpty命令,又出现找不到sh

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

增加 ../也不行了

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

奇怪的是sh确实在usr下,以为是没有环境变量,就加了PATH,打印当前路径

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

查看sh在哪,但是就是找不到这个目录,与上面的不一样,可以通过../进去

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

问题主要是在启动git-bash的时候路径是设定了用户目录,并且git的路径是Git/bin已经在安装Git时就在环境变量中了

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

所以bash.exe与sh.exe在同一级目录,既然不能使用usr下的sh

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

就尝试直接使用Git本目录的sh

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

成功进入容器

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

总结:当找不到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}'

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

查看所有运行容器

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

分别进入容器。

2.容器环境准备

刚刚装的启动的centos容器里面连vim都没有,,很难用。。装个vim先。

使用 yum search vim 更新搜索源

使用 yum install vim 安装vim

三台机器都安装!

安装完成如下

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

中间有选择的地方都选y。。。

然后查看ip,发现ifconfig命令也没有,再安装

使用search

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

提示我们只需要安装基础工具  yum install net-tools.x86_64

安装好了,执行试试

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

为每台机器都安装一下。。。

得到docker centos 三台ip

172.17.0.3

172.17.0.2

172.17.0.4 (都是局域网ip,不怕暴露)

顺便安装一下wget,下载consul需要。三个容器都需要。和上面一样操作。

下载consul,三个容器都需要。和上面一样操作。速度比较慢,链接超时就多试几次。

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

下载下来发现名字太长,改下名,

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

解压时发现没有unzip命令

执行  yum install unzip    三个容器都需要。

然后执行解压 unzip consul.zip   三个容器都需要。

然后把命令拷贝到bin目录  三个容器都需要。

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

开启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 &

查看最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

已启动consul三台如下

  • consul1   172.17.0.3   sever模式 开启了ui
  • consul2   172.17.0.2   server模式
  • consul3   172.17.0.4   client 模式

查看日志

目前都是这样,没有leader

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

执行加入节点,

在172.17.0.3上执行,将ip是02和04的都加入进来

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

加入失败,因为nodeId重复

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

有两种解决方法:

  1. 禁止  -disable-host-node-id  我这里想使用这种方法,但是无效,所以只能使用下面的方法重新生成一个id
  2. 重新生成  -node-id=$(uuidgen | awk '{print tolower($0)}')

再次分别启动

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

重新加入集群

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

加入成功一个,一个因为集群名字漏了一个字符,改为dc1重新启动04机器即可。

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

加入成功。

在02 03 04 机器上查看

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

可见已经成功。

 

使用windows 发现ping不通172.17.0.3 172.17.0.2 172.17.0.4 的,查看docker的ip

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

查看route print

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

通过配置路由表实现ip互通

route -p add 172.17.0.0 MASK 255.255.255.0 10.0.75.2

使用CMD命令行的管理员执行。

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

再次看路由

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

ping docker的容器

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

由于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

保存容器状态,不然下次又要下载了。

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

因为consul的一致性算法需要投票超过一半,即时指定了 -bootstrap-expect=3 可以选自己,但可能还是server需要三台,两台选不出leader吧,我也不是很确定这个。

再运行一个容器。这回不需要再下载命令了,很快。

得到ip  172.17.0.5 

这回分分钟启动consul

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

再加入集群即可

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

查看172.17.0.3的日志,可见已经成功选出了leader就是consul2

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

现在从浏览器上访问http://172.17.0.3:8301/

日志输出

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

在机器上查询节点信息,发现节点已经同步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机器

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)由于默认的为127.0.0.1:8500,这个地址是没办法被windows宿主访问的,所以绑定了172.17.0.3,但是此时又会出现无法查看成员

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

指定ip,端口还是一样8500

consul members --http-addr 172.17.0.3:8500

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

最后在Windows宿主机访问 http://172.17.0.3:8500

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

弄了几个小时。。单数据中心的集群终于搭建完毕。

总结 :

  1. 搞完所有环境保存容器状态,docker commit CONTAINER_ID IMAGE
  2. 下次直接启动上次commit的容器 并进入(下面命令与上面无关,下回使用时ip等参数查询出来再对应修改
  3. 在4台机器上执行运行 docker run -d “上次commit的镜像id”  ../bin/sh -c "while true; do echo hello world; sleep 1; done"
  4. 在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会变,不建议手动绑定。

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

我的配置文件 conf.json (本地需要经常用,用配置文件方便)

{"datacenter": "scala-micros","data_dir": "D:/cdata","log_level": "INFO","node_name": "consul_scala_test","server": true,"ui":true,"bootstrap":true
}

这里分别指定了

  1. 数据中心名称
  2. 数据存放目录
  3. 日志级别
  4. 节点名称
  5. 是服务器节点
  6. 开启ui
  7. 是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命令行

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

访问本地ui页面 http://localhost:8500/ui/scala-micros/services/consul

最详细的 在Windows上 使用docker 搭建 consul 集群 (附单机版)

未经许可,禁止转载。

  相关解决方案