利用 swarm + consul 架構一個基於 docker 的基礎建設
可以做到
- 機器無預警關機時服務可自動在另一台機器啟動
- 服務 loading 附載超過臨界值時,可以動態在其他機器新增服務做負載均衡
- 在上述兩種情況皆保存用戶的 session
詳細說明請參考架構說明
準備四台裝好 docker 的vm,一台 master,三台 nodes
docker daemon 啟動時需加入下列參數 "-H 0.0.0.0:2376 -H unix:///var/run/docker.sock"
$ docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 --name consul progrium/consul -server -bootstrap
$ curl -L http://master_ip:8500/v1/catalog/nodes
[{"Node":"node1","Address":"172.17.0.2"}]
$ docker run -d --name swarm swarm join --advertise=node_ip:2376 consul://master_ip:8500/v1/kv/swarm
$ docker run -d -p 4000:4000 --name swarm swarm manage consul://master_ip:8500/v1/kv/swarm
$ docker -H master_ip:4000 info
Containers: 3
Images: 4
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 3
docker01: mydocker02:2376
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 778.3 MiB
└ Labels: executiondriver=native-0.2, kernelversion=3.19.0-28-generic, operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
docker02: mydocker03:2376
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 778.3 MiB
└ Labels: executiondriver=native-0.2, kernelversion=3.19.0-28-generic, operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
docker03: mydocker04:2376
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 778.3 MiB
└ Labels: executiondriver=native-0.2, kernelversion=3.19.0-28-generic, operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
CPUs: 3
Total Memory: 2.28 GiB
Name: 04511c8c45b8
docker run -d --name interlock --restart=always ehazlett/interlock:0.3.1 --swarm-url tcp://master_ip:4000 --plugin nginx start
docker run -d -p 80:80 --link interlock:goweb.example.url genchilu/nginx
docker run -d --name redis-server -p 6379:6379 --restart=always genchilu/redis
docker -H master_ip:4000 run -d -P -h goweb.example.url --restart=always genchilu/go-web-example -sessiontype=redis -redisinfo=master_ip:6379 -sessionlifetime=3000
docker run -ti --rm genchilu/checkalive -a "-sessiontype=redis -redisinfo=master_ip:6379 -sessionlifetime=3000" -i "genchilu/go-web-example" -o "-d -P -h goweb.example.url --restart=always" -s "master_ip:4000" -t 10
登入後可看到使用者,瀏覽次數和此時服務所在的 container 的 ip
(refresh 頁面瀏覽次數會增加)
在 master 上輸入下列指令查找當前服務部署在那一台機器
$>docker -H master_ip:4000 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0e3bbc78c4d genchilu/go-web-example "/main -sessiontype=r" Less than a second ago Up Less than a second 192.168.99.109:32770->8080/tcp mydocker02/condescending_goldstine
此時瀏覽 http://master_ip 會出現 502 錯誤
等約兩到三分鐘(時間長短取決於 swarm manager 對失敗節點訊息的同步速度)
再重新瀏覽 http://master_ip 可發現網頁自動恢復,且保有上次登入的 session
在 master 上連續發佈 demo 用的 web
# 每輸入一次及發佈一次
docker -H master_ip:4000 run -d -P -h goweb.example.url --restart=always genchilu/go-web-example -sessiontype=redis -redisinfo=master_ip:6379 -sessionlifetime=3000
瀏覽 http://master_ip 後持續刷新,會發現 ip 會不同,可見每次存取頁面都連到不同的 container