Created
July 6, 2016 04:50
-
-
Save twang2218/6bddf42c0d64422f945f898bf3dc76cd to your computer and use it in GitHub Desktop.
Create a Docker Swarm cluster with `docker run` (without using docker-machine)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#/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