Skip to content

Instantly share code, notes, and snippets.

@matt-deboer
Last active September 2, 2016 22:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matt-deboer/3b81462f795166d736d91ca5be0a4e65 to your computer and use it in GitHub Desktop.
Save matt-deboer/3b81462f795166d736d91ca5be0a4e65 to your computer and use it in GitHub Desktop.
Bakefile to create a docker 1.12 swarm on OSX with docker-machine-driver-xhyve support
#!/bin/bash
set -u
#. creates a new swarm. params name, [driver], [workers], [managers]
create-swarm() {
bake_params name
local driver=${driver:=virtualbox}
local workers=${workers:=2}
local managers=${managers:=1}
primary_master="${name}-manager-1"
create_machine ${primary_master} ${driver}
primary_master_ip=$(docker-machine ip ${primary_master})
eval $(docker-machine env ${primary_master})
docker swarm init --advertise-addr ${primary_master_ip}
local worker_token=$(docker swarm join-token -q worker)
local master_token=$(docker swarm join-token -q manager)
if [[ ${managers} -gt 1 ]]; then
for i in $(seq 2 ${managers}); do
node_name="${name}-manager-${i}"
create_machine "${node_name}" "${driver}"
eval $(docker-machine env ${node_name})
echo "Executing: docker swarm join --token ${master_token} ${primary_master_ip}:2377"
docker swarm join --token "${master_token}" ${primary_master_ip}:2377
done
fi
for i in $(seq 1 ${workers}); do
node_name="${name}-worker-${i}"
create_machine "${node_name}" "${driver}"
eval $(docker-machine env ${node_name})
echo "Executing: docker swarm join --token ${worker_token} ${primary_master_ip}:2377"
docker swarm join --token "${worker_token}" ${primary_master_ip}:2377
done
eval $(docker-machine env ${primary_master})
docker network create --driver overlay ${name}-overlay
}
#. removes a swarm. params name [keep_keystore]
rm-swarm() {
bake_params name
for machine in $(docker-machine ls | grep -E "${name}-(master|node|manager|worker)" | awk '{print $1}'); do
docker-machine rm -f ${machine}
done
}
function create_machine() {
local node_name=$1
local driver=$2
if [[ ! "$(which docker-machine-driver-xhyve)" ]]; then
install_xhyve
fi
docker-machine create -d ${driver} ${node_name}
if [[ "${driver}" == "xhyve" ]]; then
docker-machine ssh ${node_name} \
"sudo sh -c 'echo \"hostname ${node_name}\" >> /var/lib/boot2docker/profile'"
docker-machine ssh ${node_name} "sudo hostname ${node_name}"
fi
}
function install_xhyve() {
echo "Looks like you don't have the xhyve provider installed;
I'll attempt to install it for you...'"
if [[ "$(which go)" ]]; then
export GO15VENDOREXPERIMENT=1
go get -u github.com/zchee/docker-machine-driver-xhyve
sudo chown root:wheel $GOPATH/bin/docker-machine-driver-xhyve
sudo chmod u+s $GOPATH/bin/docker-machine-driver-xhyve
elif [[ "$(which brew)" ]]; then
brew install docker-machine-driver-xhyve
sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
else
echo "Looks like you don't have go or homebrew installed;
I need one of those in order to install the xhyve driver.
See docs here: https://github.com/zchee/docker-machine-driver-xhyve"
exit 1
fi
}
@matt-deboer
Copy link
Author

matt-deboer commented Aug 17, 2016

This is a Bakefile, which uses kyleburton/bake; once you've installed bake, just create the cluster by running the following from the directory where you've placed the Bakefile:

bake create-swarm driver=xhyve name=swarm1

which builds a cluster of 1 manager and 2 workers.

Create a larger cluster like so:

bake create-swarm driver=xhyve name=swarm1 workers=5 managers=3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment