延續 Raspberry pi with Docker Swarm 跨網域溝通使用 network,在實際上的應用有可能某個 Raspberry pi 重啟或更換,希望可以透過 docker run 的方式讓 docker 重新上線,也因此研究解析了一下 docker swarm 的運作過程。
首先一旦建立完成 docker swarm 叢集之後,我們可以解析一下 command,透過下列指令:
docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)
將會列出類似以下內容:
/web-slave-01 {[/bin/bash -l -c npm start]}
/mysql {[/run.sh]}
/swarm-agent {[join --advertise 192.168.99.114:2376 consul://192.168.99.112:8500]}
/swarm-agent {[join --advertise 192.168.99.113:2376 consul://192.168.99.112:8500]}
/swarm-agent-master {[manage --tlsverify --tlscacert=/var/lib/boot2docker/ca.pem --tlscert=/var/lib/boot2docker/server.pem --tlskey=/var/lib/boot2docker/server-key.pem -H tcp://0.0.0.0:3376 --strategy spread consul://192.168.99.112:8500]}
若是使用 hypeiot 則會像
/swarm-agent {[join --advertise 192.168.168.120:2376 consul://192.168.168.120:8500]}
/swarm-agent-master {[manage --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:3376 --strategy spread consul://192.168.168.120:8500]}
/elegant_borg {[-server -bootstrap]}
就可以看到每個 docker 運行的 command,經過拆解後,測試過後確實可以重現,相關 command 如下:
swarm master start
docker run -d \
--name swarm-agent-master \
-p 3376:3376 \
-v /var/lib/boot2docker:/var/lib/boot2docker \
swarm manage \
--tlsverify \
--tlscacert=/var/lib/boot2docker/ca.pem \
--tlscert=/var/lib/boot2docker/server.pem \
--tlskey=/var/lib/boot2docker/server-key.pem \
-H tcp://0.0.0.0:3376 \
--strategy spread consul://192.168.99.112:8500
需要注意的是,在 command 中沒有辦法知道的參數,掛載 /var/lib/boot2docker 是因為需要 key 讓 docker-machine 可以進行操作
-v /var/lib/boot2docker:/var/lib/boot2docker
同樣為了讓 swarm manage 可以存取,需要把 port 開放出來
-p 3376:3376
--strategy spread
中的 consul ip 也是需要進行更換的
啟動 agant
master 上的 agent
docker run -d --name swarm-agent swarm join --advertise 192.168.99.113:2376 consul://192.168.99.112:8500
slave 上的 agent
docker run -d --name swarm-agent swarm join --advertise 192.168.99.114:2376 consul://192.168.99.112:8500
其中 --advertise
的 ip 將因為機台不同而異,當然也可以使用變數替代,就給大家自由發揮了!
結論
如此一來,即使是既有的 server 或是因為重啟已運行的 swarm 被 shutdown 我們也可以使用指令將它重啟,相信可以在合適的場合使用,畢竟有些時候透過 docker machine 的 drive 新建機器需要花一些時間,若能夠使用 command 把 swarm 重啟,整個反應時間也可以加快許多,給大家參考。