Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@twang2218
Created July 6, 2016 04:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save twang2218/6bddf42c0d64422f945f898bf3dc76cd to your computer and use it in GitHub Desktop.
Save twang2218/6bddf42c0d64422f945f898bf3dc76cd to your computer and use it in GitHub Desktop.
Create a Docker Swarm cluster with `docker run` (without using docker-machine)
#/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 $@
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment