Docker Swarm Mode¶
For truly highly-available services with Docker containers, we need an orchestration system. Docker Swarm (as defined at 1.13) is the simplest way to achieve redundancy, such that a single docker host could be turned off, and none of our services will be interrupted.
Add some handy bash auto-completion for docker. Without this, you'll get annoyed that you can't autocomplete
docker stack deploy <blah> -c <blah.yml> commands.
Install some useful bash aliases on each host
1 2 3
Release the swarm!¶
Now, to launch a swarm. Pick a target node, and run
docker swarm init
Yeah, that was it. Seriously. Now we have a 1-node swarm.
1 2 3 4 5 6 7 8 9 10 11 12
docker node ls to confirm that you have a 1-node swarm:
1 2 3 4
Note that when you run
docker swarm init above, the CLI output gives youe a command to run to join further nodes to my swarm. This command would join the nodes as workers (as opposed to managers). Workers can easily be promoted to managers (and demoted again), but since we know that we want our other two nodes to be managers too, it's simpler just to add them to the swarm as managers immediately.
On the first swarm node, generate the necessary token to join another manager by running
docker swarm join-token manager:
1 2 3 4 5 6 7 8
Run the command provided on your other nodes to join them to the swarm as managers. After addition of a node, the output of
docker node ls (on either host) should reflect all the nodes:
1 2 3 4 5
Setup automated cleanup¶
Docker swarm doesn't do any cleanup of old images, so as you experiment with various stacks, and as updated containers are released upstream, you'll soon find yourself loosing gigabytes of disk space to old, unused images.
To address this, we'll run the "meltwater/docker-cleanup" container on all of our nodes. The container will clean up unused images after 30 minutes.
First, create docker-cleanup.env (mine is under /var/data/config/docker-cleanup), and exclude container images we know we want to keep:
Then create a docker-compose.yml as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Setup unique static subnets for every stack you deploy. This avoids IP/gateway conflicts which can otherwise occur when you're creating/removing stacks a lot. See my list here.
Launch the cleanup stack by running
docker stack deploy docker-cleanup -c <path-to-docker-compose.yml>
Setup automatic updates¶
If your swarm runs for a long time, you might find yourself running older container images, after newer versions have been released. If you're the sort of geek who wants to live on the edge, configure shepherd to auto-update your container images regularly.
Create /var/data/config/shepherd/shepherd.env as follows:
1 2 3 4
Then create /var/data/config/shepherd/shepherd.yml as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13
Launch shepherd by running
docker stack deploy shepherd -c /var/data/config/shepherd/shepherd.yml, and then just forget about it, comfortable in the knowledge that every day, Shepherd will check that your images are the latest available, and if not, will destroy and recreate the container on the latest available image.
Chef's Notes 📓¶
Tip your waiter (support me) 👏¶
Did you receive excellent service? Want to make your waiter happy? (..and support development of current and future recipes!) See the support page for (free or paid) ways to say thank you! 👏
Flirt with waiter (subscribe) 💌¶
Want to know now when this recipe gets updated, or when future recipes are added? Subscribe to the RSS feed, or leave your email address below, and we'll keep you updated. (double-opt-in, no monkey business, no spam either - check the archive for proof!)