То, как я подошел к этому, заключалось в том, чтобы иметь общий сценарий сборки для всех узлов и использовать Consul для совместного использования токена менеджера роя docker с остальной частью кластера.
Первый узел (на 10.0.0.51
) вызывает docker swarm init
и помещает токен в хранилище значений ключей, а оставшиеся узлы (на 10.0.0.52
и далее) читают токен назад и используют его для вызова docker swarm join
.
Баш выглядит примерно так -
# Get the node id of this machine from the local IP address
privateNetworkIP=`hostname -I | grep -o 10.0.0.5.`
nodeId=`(echo $privateNetworkIP | tail -c 2)`
if [ $nodeId -eq 1 ]; then
sudo docker swarm init
MANAGER_KEY_IN=`sudo docker swarm join-token manager -q`
curl --request PUT --data $MANAGER_KEY_IN http://10.0.0.51:8500/v1/kv/docker-manager-key
else
MANAGER_KEY_OUT=`curl -s http://10.0.0.51:8500/v1/kv/docker-manager-key?raw`
sudo docker swarm join --token $MANAGER_KEY_OUT 10.0.0.51:2377
fi
... и работает нормально при условии, что сначала будет построен node 1
.