Backuper une base mysql en docker swarm mode

Docker 1.12 est arrivé, et avec lui sans doute une des plus grosses features attendues : le swarm mode directement intégré au Docker engine.

Je me suis donc lancé, comme sans doute nombre de mes pairs, dans une mise en place sur un cas concret : la migration du blog que vous êtes en train de lire 🙂

Et j’avoue que je suis bluffé par la simplicité de mise en place. En quelques heures (et encore parce que je faisais autre chose en même temps), ce blog (un simple WordPress) a été containerizé et rendu accessible en quelque lignes.

Cependant, je suis assez vite tombé sur un os : comment faire pour backuper ma base MySQL, elle-même dans un container service ? Ca a l’air bête, mais ça n’est pas si simple…

Le problème

Avoir un blog en ligne c’est bien, mais comme beaucoup d’applications, il est important de pouvoir la backuper en cas de problème (on n’est jamais trop prudent).

Seulement voilà ! Le MySQL est un service docker qui tourne donc sur un network de type overlay (c’est une contrainte de l’outil), et pour y accéder il faut un container qui soit sur le même réseau. Or, vous ne pouvez pas assigner un network de type overlay à un container lancé via docker run 😭

L’explication est dans la documentation de Docker sur le networking.

Dommage car cela empêche de planifier un simple mysqldump quotidien (en évitant d’installer le client mysql sur le host lui-même en plus).

Ma solution

En fait, je ne vois plus que 2 solutions :

  • créer un service docker qui fasse ce backup (relou à faire pour un bête backup)
  • publier le port 3306 de MySql pour accéder au service depuis le host (et tant pis en installant le mysql client)

Je suis parti sur la solution 2. Cependant, comme le serveur est directement raccordé à l’Internet, je ne veux pas que les gens du monde entier y accède de l’extérieur.

Pour cela, j’ai simplement limité l’accès au port 3306 aux seules ip du localhost

iptables -t filter -A FORWARD -p tcp --dport 3306 -s 127.0.0.1/16 -j ACCEPT
iptables -t filter -A FORWARD -p tcp --dport 3306 -j REJECT

Evidemment, ça c’est la solution basique. Le mieux si vous êtes prudent (et pas nécessairement parano) est de fermer l’ensemble des ports et de n’ouvrir que ceux qui sont vraiment nécessaires.

 

Si vous avez une meilleure idée, n’hésitez pas à la poster en commentaire !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *