How to upgrade a Docker Swarm Mode cluster

Upgrade the Docker engine on a a Docker Swarm mode cluster without downtime

posted 2017-11-20 by Thomas Kooi

Docker Swarm mode

Here’s how to upgrade Docker in a Swarm mode cluster without cluster down time.

For this it is assumed you have a High-Available cluster with multiple workers and managers. If you don’t have one, check out Terraform Swarm mode cluster

Different versions across the cluster

First off; It’s best to try and stick to the same Docker version across all nodes in a cluster, including managers. You should aim to always keep your managers on the same Docker version and not perform any other actions during an update, such as deploying a new service or adding/removing nodes to the cluster to avoid potential issues and backwards compatability issues.

Upgrading a node

Note that when performing a Docker upgrade in your cluster, it’s recommended to first upgrade all managers, followed by the workers.

Here are the steps to walk through when upgrading any node in your cluster:

Drain all tasks

First drain the node from all tasks. This is important because Docker will need to be restarted as part of the upgrade process.. This is done through using the node update command on a manager node. For example:

$ docker node update --availability drain mynodename

Verify that there are no more tasks running on this node. This can be done by running a docker node ps for the node. node ps accepts a node id or node name, which can be found by running a docker node ls command.

$ docker node ps mynodename

ID                  NAME                  IMAGE               NODE                    DESIRED STATE       CURRENT STATE                ERROR               PORTS
hokodd8xxwoh        wizardly_franklin.2   nginx:alpine        linuxkit-00155d4b0183   Running             Running about a minute ago
47zn60dn6aix        wizardly_franklin.5   nginx:alpine        linuxkit-00155d4b0183   Running             Running about a minute ago
mq43e2ru4loj        wizardly_franklin.6   nginx:alpine        linuxkit-00155d4b0183   Running             Running about a minute ago

When there are no tasks running anymore, the output should be empty. In the above example, three tasks are still running.

Performing the update

Once this is the case you can perform your Docker update. For example with CentOS using yum:

$ yum upgrade -y docker-ce

Verify that the update went correctly;

$ docker -v
Docker version 17.12.0-ce, build c97c6d6

Or by for instance running docker run --rm hello-world.

When complete you can set the availability of the node back to available.

$ docker node update --availability active mynodename

For more information view Docker’s documentation on managing nodes, or check out this Github issue for some additional explaination on upgrading Docker engine on Swarm mode nodes.