问题:在 OSX 上访问在 docker 中运行的 consul UI

我有一个类似于如何从外部访问 consul UI的问题,但我无法让网络选项的组合正常工作。

我在 OSX 上使用 Docker for Mac,而不是旧的 docker-machine 东西,以及官方 consul docker 映像,而不是 progrium/docker 映像。

我可以使用启动一个 3 节点服务器集群

docker run -d --name node1 -h node1 consul agent -server -bootstrap-expect 3
JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' node1)"
docker run -d --name node2 -h node2 consul agent -server -join $JOIN_IP
docker run -d --name node3 -h node3 consul agent -server -join $JOIN_IP

到目前为止一切顺利,它们相互连接并且工作正常。现在我想启动一个代理,并通过它查看 UI。

我尝试了一堆 -client 和 -bind 的组合,这似乎是所有这些的关键。使用

docker run -d -p 8500:8500 --name node4 -h node4 consul agent -join $JOIN_IP  -ui -client=0.0.0.0 -bind=127.0.0.1

我可以通过http://localhost:8500/ui/获取 UI,并且领事成员显示所有节点:

docker exec -t node4 consul members
Node   Address          Status  Type    Build  Protocol  DC
node1  172.17.0.2:8301  alive   server  0.7.1  2         dc1
node2  172.17.0.3:8301  alive   server  0.7.1  2         dc1
node3  172.17.0.4:8301  alive   server  0.7.1  2         dc1
node4  127.0.0.1:8301   alive   client  0.7.1  2         dc1

但一切都不好;在 UI 中它告诉我 node4 是“代理不存在或无法访问”并且在它的日志中有一大堆

2016/12/19 18:18:13 [ERR] memberlist: Failed to send ping: write udp 127.0.0.1:8301->172.17.0.4:8301: sendto: invalid argument

我尝试了许多其他组合---netu003dhost 只是在 OSX 上搞砸了。

如果我尝试 -bindu003dmy box's external IP 它不会启动,

Error starting agent: Failed to start Consul client: Failed to start lan serf: Failed to create memberlist: Failed to start TCP listener. Err: listen tcp 192.168.1.5:8301: bind: cannot assign requested address

我还尝试映射所有其他端口,包括 udp 端口(-p 8500:8500 -p 8600:8600 -p 8400:8400 -p 8300-8302:8300-8302 -p 8600:8600/udp -p 8301-8302: 8301-8302/udp),但这并没有改变任何东西。

如何将节点加入此集群并查看 UI?

解答

尝试使用 Consul 的 0.7.2 版本并使用以下语法启动代理(0.7.2 的测试版,0.8.0 的最终版)语法:

$ docker run -d -p 8500:8500 --name node4 -h node4 consul agent -join $JOIN_IP -ui -client=0.0.0.0 -bind='{{ GetPrivateIP }}'

更改是-bind的参数,Consul 现在将呈现私有 IP 地址的 IP 地址。其他模板参数记录在hashicorp/go-sockaddr中。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区