Below you have few ways to create small consul clusters that will do nothing, just to show you how they can be made to connect to each other.
Useful things to work with
Here you have just small docker tricks to be able to see what consul is doing and what is exposing.
View container's logs by having them shown as they come, starting with the last 10 lines:
docker logs -f --tail 10 CONTAINER_NAME
root@uranus:~# docker logs -f --tail 10 c4 2019/04/11 21:12:55 [DEBUG] memberlist: Stream connection from=192.168.11.28:44010 2019/04/11 21:13:12 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically 2019/04/11 21:13:12 [DEBUG] agent: Node info in sync 2019/04/11 21:13:15 [DEBUG] memberlist: Initiating push/pull sync with: 192.168.11.28:8301 2019/04/11 21:13:25 [DEBUG] memberlist: Stream connection from=192.168.11.28:44011 2019/04/11 21:13:30 [DEBUG] manager: Rebalanced 2 servers, next active server is uranus.dc1 (Addr: tcp/192.168.11.10:8300) (DC: dc1) 2019/04/11 21:13:37 [DEBUG] memberlist: Initiating push/pull sync with: 192.168.11.28:8302 2019/04/11 21:13:39 [DEBUG] memberlist: Stream connection from=192.168.11.28:42384 2019/04/11 21:13:45 [DEBUG] memberlist: Initiating push/pull sync with: 192.168.11.28:8301 2019/04/11 21:13:55 [DEBUG] memberlist: Stream connection from=192.168.11.28:44014
View container's open ports:
docker port CONTAINER_NAME
23:06:22 root@service:~# docker port c1 8300/tcp -> 0.0.0.0:8300 8301/tcp -> 0.0.0.0:8301 8301/udp -> 0.0.0.0:8301 8302/tcp -> 0.0.0.0:8302 8302/udp -> 0.0.0.0:8302 8500/tcp -> 0.0.0.0:8500 8600/tcp -> 0.0.0.0:8600 8600/udp -> 0.0.0.0:8600
Consul's web interface:
http://HOSTPORT:8500
Consul's port needs
Server RPC (Default 8300/TCP) - used by servers to handle incoming requests from other agents
Serf LAN (Default 8301/TCP/UDP) - used to handle gossip in the LAN. Required by all agents
Serf WAN (Default 8302/TCP/UDP) - used by servers to gossip over the WAN to other servers
HTTP API (Default 8500/TCP) - used by clients to talk to the HTTP API
DNS Interface (Default 8600/TCP/UDP) - used to resolve DNS queries
Create a small docker consul cluster in one host
In this example, a 3 nodes consul cluster will be created within the same host. As you can see, the communication is done within the docker's private network.
23:54:06 root@service:~# docker run -d --name=c1 -p 8301:8301 -p 8500:8500 consul agent -dev -client=0.0.0.0 -bind=0.0.0.0 49ffdb1c7da1b990f95f31068c1868d80ce2476e150cd3ae0ac4239faad8c64e 23:55:04 root@service:~# IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' c1); echo $IP 172.17.0.6 23:55:09 root@service:~# docker run -d --name c2 consul agent -dev -bind=0.0.0.0 -join=$IP 325d5bb7d7c81dad03e6cb9713454683a1af27d9930e1c1227db5a9c885b38d4 23:55:14 root@service:~# docker run -d --name c3 consul agent -dev -bind=0.0.0.0 -join=$IP 66be7144da0342e9b9316a2d3f35ad267423da6c543b23367a013d6f7a687159 23:55:23 root@service:~# docker exec -t c1 consul members Node Address Status Type Build Protocol DC Segment 325d5bb7d7c8 172.17.0.7:8301 alive server 1.4.4 2 dc1 <all> 49ffdb1c7da1 172.17.0.6:8301 alive server 1.4.4 2 dc1 <all> 66be7144da03 172.17.0.8:8301 alive server 1.4.4 2 dc1 <all>
Create a small docker consul cluster between hosts
In this example we attempt to create a two nodes consul cluster between two hosts. As you may notice, this time we will not use docker's private network but the host's one.
On host1:
23:58:45 root@service:~# docker run -d --network host --name=c1 consul agent -dev -client=0.0.0.0 -bind=192.168.11.28 089fc4c0ea905827e29df93d481948552602a840d196db8a7daa4e8676acd58e 23:58:52 root@service:~# docker exec -t c1 consul members Node Address Status Type Build Protocol DC Segment service 192.168.11.28:8301 alive server 1.4.4 2 dc1 <all>
On host2:
root@uranus:~# docker run -d --network host --name c4 consul agent -dev -bind=192.168.11.10 -join=192.168.11.28 fe2ebf7f573ae462a3835bf5090f02748edd11c96cf046a85d78918ef8a8776d root@uranus:~# docker exec -t c4 consul members Node Address Status Type Build Protocol DC Segment service 192.168.11.28:8301 alive server 1.4.4 2 dc1 <all> uranus 192.168.11.10:8301 alive server 1.4.4 2 dc1 <all>