踩坑-docker搭建consul无法启动问题(No private IPv4 address found)

踩坑-docker搭建consul无法启动问题(No private IPv4 address found)

1098发表于2020-03-21

最近在用consul做分布式配置中心时,遇到一个奇葩的问题:自己的虚拟机正常,但是发布到有一台服务器上就有问题,另外服务器也ok的。

一、软件环境

虚拟机docker版本:

from clipboard

服务器docker版本:

from clipboard

二、问题现象

1、通过-bind 0.0.0.0,报下命令错误

[root@localhost ~]# docker run -idt --name cs1 -p 8500:8500  -v /data/cs1:/data consul agent -server -bind 0.0.0.0 -node consul-server-1  -data-dir /data -bootstrap-expect 1 -client 0.0.0.0 -ui

错误信息:

[root@localhost ~]# docker logs cs1
==> No private IPv4 address found

2、通过指定ip,-bind 192.168.1.105,报如下错误

[root@localhost ~]#docker run -idt --name cs1 -p 8500:8500  -v /data/cs1:/data consul agent -server -bind 192.168.1.105 -node consul-server-1  -data-dir /data -bootstrap-expect 1 -client 0.0.0.0 -ui

错误信息:

==> Log data will now stream in as it occurs:

    2020-03-20T10:45:57.560Z [INFO]  agent.server: shutting down server
    2020-03-20T10:45:57.560Z [ERROR] agent: Error starting agent: error="Failed to start Consul server: Failed to start RPC layer: listen tcp 192.168.1.105:8300: bind: cannot assign requested address"
    2020-03-20T10:45:57.561Z [INFO]  agent: Exit code: code=1

三、问题分析

网上搜索了半天都没有找到真正的原因?

同样是使用的官方image。为什么在虚拟机和其它服务器使用0.0.0.0可以成功启动?奇怪的是使用ifconfig出来的本机私有局域网ip来bind也不成功!

后来通过对比docker启动的容器情况,找到了根本原因。(通过docker inspect 容器名)

docker inspect cs1


虚拟机:

from clipboard

问题服务器:

from clipboard

从上面两张图可以看到成功的docker容器是有分配到ip地址和网关的,而出问题的服务器这些值都是空值。这台服务器也还启动了其它容器也是正常的。

具体什么原因到目前为止我也百思不得其解!如果有知道的大神请告知一下,谢谢。(猜测是服务器哪里配置或docker版本引起的)

ps=============================================

通过docker启动consul不能使用本机宿主主机ip来绑定,因为docker默认的网络模式是桥接方式,会在启动容器后自动分配一个ip给docker对应的虚拟网卡,类似这样的,172.17.X.X。

但是为什么通过0.0.0.0的方式却报找不到私有ip?

==> No private IPv4 address found

四、问题解决

突然之间灵感来了,既然通过0.0.0.0不行,要不试试127.0.0.1?

最后通过127.0.0.1果然行得通。

docker run -idt --name cs1 -p 8500:8500  -v /data/cs1:/data consul agent -server -bind=127.0.0.1 -node consul-server-1  -data-dir /data -bootstrap-expect 1 -client 0.0.0.0 -ui

成功启动consul

五、总结

consul启动重要参数-bind需要是私有ip地址,默认其实就是0.0.0.0。当遇到问题的时候一定要先从环境差异性或根源上原因,如果根源上找不到知道问题,可以采用试探法解决问题。

consul有三种模式运行,client, server,dev。

注意:dev模式运行是不会持久化数据,也就重启之后保存的配置信息会丢失。

下面配上consul启动参数简单说明:

agent                      Consul的核心命令,主要作用有维护成员信息、运行状态检测、声明服务以及处理请求等
-server                    就是代表server模式
-ui                    代表开启web 控制台
-bootstrap-expect        代表想要创建的集群数目,官方建议3或者5
-data-dir                       数据存储目录
-node                           代表当前node的名称
-client                          应该是一个客户端服务注册的地址,可以和当前server的一致也可以是其他主机地址,系统默认是127.0.0.1
-bind                            集群通讯地址


运行cosnul agent以server模式:
    -server : 定义agent运行在server模式
    -bootstrap-expect :在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用
    -bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
    -node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
    -ui-dir: 提供存放web ui资源的路径,该目录必须是可读的
    -rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
    -config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载
    -client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0

小编蓝狐