Mô hình

- 1 swarm manager node + consul server + registrator.
- 2 swarm worker node + registrator.

Hệ điều hành- CentOS 7.

Thực hiện trên tất cả các nodes

$ export PRIVATE_IP=[IP-of-node]
$ vim  /usr/lib/systemd/system/docker.service
ExecStart =  --cluster-advertise=[IP-swarm-mgr]:2375 --cluster-store=consul://[IP-swarm-mgr]:8500 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock  
$ systemctl daemon-reload
$ systemctl restart docker

Tại node Swarm manager:

Start consul container cho service discovery:

$docker run -d --name consul-srv-1 --restart=always -h consul-srv-1 -v /var/lib/consul:/data -p ${PRIVATE_IP}:8300:8300 -p ${PRIVATE_IP}:8301:8301 -p ${PRIVATE_IP}:8301:8301/udp -p ${PRIVATE_IP}:8302:8302 -p ${PRIVATE_IP}:8302:8302/udp -p ${PRIVATE_IP}:8400:8400 -p ${PRIVATE_IP}:8500:8500 -p ${PRIVATE_IP}:53:53/udp progrium/consul -server -advertise ${PRIVATE_IP} -bootstrap

Start swarm manager:

$docker run -d --name swarm-mgr -p 3375:2375 --restart=always swarm manage -H tcp://0.0.0.0:2375 consul://[IP-consul-server]:8500/

Tại node worker:

$docker run -d --name swarm-agent --restart=always swarm join --advertise=[ip-swarm-worker-node]:2375 consul://[ip-consul-server]:8500/

Start container registrator tại tất cả các nodes:

$docker run -d --name=registrator --restart=always -h [IP-of-node] --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:v6 consul://[ip-consul-server]:8500

Consul-template là 1 third-party tool, tool này sẽ update lại config mỗi khi consul có sự kiện update/insert/add/remove 1 service instance nào đó.

$cd /usr/local/src
$ wget https://releases.hashicorp.com/consul-template/0.13.0/consul-template_0.13.0_linux_amd64.zip
$unzip consul-template_0.13.0_linux_amd64.zip
$mv consul-template /usr/local/bin/

Ví dụ, tạo 1 file temp.ctmpl và query vào consul master với app tên là "app":

${{range service "app"}}  server {{.Node}}-{{.Port}} {{.Address}}:{{.Port}} check fall 3 rise 5 inter 2000 weight 2 {{end}}

rồi chạy command dưới đây, consul-template sẽ chạy như daemon và lắng nghe sự kiện tại consul-master

$consul-template -consul [ip-consul-server]:8500 -template "/etc/haproxy/haproxy.ctmpl:/etc/haproxy/haproxy.cfg:service haproxy reload"