Accessing consul UI running in docker on OSX

3.8k views Asked by At

I have a problem similar to How to access externally to consul UI but I can't get the combinations of network options to work right.

I'm on OSX using Docker for Mac, not the old docker-machine stuff, and the official consul docker image, not the progrium/docker image.

I can start up a 3-node server cluster fine using

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

So far so good, they're connected to each other and working fine. Now I want to start an agent, and view the UI via it.

I tried a bunch of combinations of -client and -bind, which seem to be the key to all of this. Using

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

I can get the UI via http://localhost:8500/ui/, and consul members shows all the nodes:

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

But all is not well; in the UI it tells me node4 is "Agent not live or unreachable" and in its logs there's a whole bunch of

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

I've tried a bunch of other combinations - --net=host just borks things up on OSX.

If I try -bind=my box's external IP it won't start,

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

I also tried mapping all the other ports including the udp ports (-p 8500:8500 -p 8600:8600 -p 8400:8400 -p 8300-8302:8300-8302 -p 8600:8600/udp -p 8301-8302:8301-8302/udp) but that didn't change anything.

How can I join a node up to this cluster and view the UI?

1

There are 1 answers

1
Sean On BEST ANSWER

Try using the 0.7.2 release of Consul and start the agent using the following (beta as of 0.7.2, final by 0.8.0) syntax:

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

The change being the argument to -bind where Consul will now render out the IP address of a private IP address. The other template parameters are documented in the hashicorp/go-sockaddr.