#/bin/bash | |
DOCKER_MACHINE_DRIVER=virtualbox | |
function create_kvstore { | |
echo | |
echo "Preparing Key-Value store: etcd ..." | |
echo | |
docker-machine create -d ${DOCKER_MACHINE_DRIVER} swarm-kvstore | |
eval $(docker-machine env swarm-kvstore) | |
KVSTORE_IP=$(docker-machine ip swarm-kvstore) | |
set -xe | |
docker run -d \ | |
-p 2379:2379 -p 2380:2380 -p 4001:4001 \ | |
--name etcd \ | |
quay.io/coreos/etcd:v2.3.7 \ | |
--listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 \ | |
--advertise-client-urls http://${KVSTORE_IP}:2379,http://${KVSTORE_IP}:4001 \ | |
--initial-advertise-peer-urls http://${KVSTORE_IP}:2380 \ | |
--initial-cluster default=http://${KVSTORE_IP}:2380 \ | |
--listen-peer-urls http://0.0.0.0:2380 | |
set +xe | |
export KVSTORE="etcd://${KVSTORE_IP}:2379,${KVSTORE_IP}:4001/" | |
echo "Key-Value Store is ${KVSTORE}" | |
echo "export KVSTORE=${KVSTORE}" > .kvstore.env | |
} | |
function create_node { | |
NAME=$1 | |
set -xe | |
docker-machine create -d ${DOCKER_MACHINE_DRIVER} \ | |
--engine-opt="cluster-store=${KVSTORE}" \ | |
--engine-opt="cluster-advertise=eth1:2376" \ | |
${NAME} | |
set +xe | |
} | |
function create_nodes { | |
Size=$1 | |
shift | |
if [[ ${Size} =~ ^[0-9]+$ ]]; then | |
for i in $(seq 0 ${Size}) | |
do | |
create_node "swarm-node${i}" | |
done | |
else | |
echo "Usage: create nodes <size>" | |
fi | |
} | |
function create_swarm_manager { | |
Node=0 | |
eval $(docker-machine env swarm-node${Node}) | |
set -xe | |
docker run -d -t \ | |
--name swarm_master \ | |
--restart=always \ | |
-v /var/lib/boot2docker:/certs:ro \ | |
-p 3376:3376 \ | |
swarm manage \ | |
-H 0.0.0.0:3376 \ | |
--tlsverify \ | |
--tlscacert=/certs/ca.pem \ | |
--tlscert=/certs/server.pem \ | |
--tlskey=/certs/server-key.pem \ | |
--advertise $(docker-machine ip swarm-node${Node}):3376 \ | |
${KVSTORE} | |
set +xe | |
} | |
function create_swarm_worker { | |
Node=$1 | |
eval $(docker-machine env swarm-node${Node}) | |
set -xe | |
docker run -d \ | |
--name swarm_worker \ | |
--restart=always \ | |
swarm join \ | |
--advertise $(docker-machine ip swarm-node${Node}):2376 \ | |
${KVSTORE} | |
set +xe | |
} | |
function create_swarm_workers { | |
Size=$1 | |
shift | |
if [[ ${Size} =~ ^[0-9]+$ ]]; then | |
for i in $(seq ${Size}) | |
do | |
create_swarm_worker ${i} | |
done | |
else | |
echo "Usage: create workers <size>" | |
fi | |
} | |
function create { | |
Command=$1 | |
shift | |
if [[ -f ".kvstore.env" ]]; then | |
source .kvstore.env | |
fi | |
case "${Command}" in | |
kvstore) create_kvstore ;; | |
nodes) create_nodes $@ ;; | |
manager) create_swarm_manager ;; | |
workers) create_swarm_workers $@ ;; | |
*) echo "Usage: create {kvstore|nodes|manager|workers}" ;; | |
esac | |
} | |
function remove_nodes { | |
Size=$1 | |
shift | |
if [[ ${Size} =~ ^[0-9]+$ ]]; then | |
for i in $(seq 0 ${Size}) | |
do | |
docker-machine rm -y swarm-node${i} | |
done | |
else | |
echo "Usage: remove nodes <size>" | |
exit 1 | |
fi | |
} | |
function remove_swarm { | |
Size=$1 | |
shift | |
if [[ ${Size} =~ ^[0-9]+$ ]]; then | |
for i in $(seq ${Size}) | |
do | |
eval $(docker-machine env swarm-node${i}) | |
docker rm -f swarm_worker | |
done | |
else | |
echo "Usage: remove swarm <size>" | |
exit 1 | |
fi | |
eval $(docker-machine env swarm-node0) | |
docker rm -f swarm_master | |
} | |
function remove { | |
Command=$1 | |
shift | |
case "${Command}" in | |
kvstore) | |
docker-machine rm swarm-kvstore | |
rm -f .kvstore.env | |
;; | |
nodes) remove_nodes $@ ;; | |
swarm) remove_swarm $@ ;; | |
*) echo "Usage: remove {kvstore|nodes|swarm}" ;; | |
esac | |
} | |
function swarm_env { | |
case "$1" in | |
"") | |
echo "export DOCKER_TLS_VERIFY=1" | |
echo "export DOCKER_HOST=tcp://$(docker-machine ip swarm-node0):3376" | |
echo "export DOCKER_CERT_PATH=$HOME/.docker/machine/machines/swarm-node0" | |
echo "# eval \$($0 env)" | |
;; | |
"--unset") | |
echo "unset DOCKER_TLS_VERIFY" | |
echo "unset DOCKER_HOST" | |
echo "unset DOCKER_CERT_PATH" | |
echo "# eval \$($0 env --unset)" | |
;; | |
*) | |
echo "Usage: env [--unset]" ;; | |
esac | |
} | |
function usage { | |
echo "Usage: $0 {create|remove|list|env}" | |
echo | |
echo "Example:" | |
echo " $0 create kvstore" | |
echo " $0 create nodes 3" | |
echo " $0 create manager" | |
echo " $0 create workers 3" | |
echo " $0 list" | |
echo " eval \$($0 env)" | |
echo " docker info" | |
echo " docker run ..." | |
echo " eval \$($0 env --unset)" | |
echo " $0 remove nodes 3" | |
echo " $0 remove kvstore" | |
} | |
function main { | |
Command=$1 | |
shift | |
case "${Command}" in | |
create) create $@ ;; | |
remove) remove $@ ;; | |
list) docker-machine ls | grep "swarm-" ;; | |
env) swarm_env $@ ;; | |
*) usage $@ ;; | |
esac | |
} | |
main $@ |
swarm-run.sh
最新推荐文章于 2025-03-19 15:40:19 发布