Dockerisez votre Raspberry Pi !
CommentairesAujourd’hui nous publions sur Raspbian France un article qui a été écrit pour nous par Franck, quarantenaire passionné de technologie, de sport et de bricolage.
Utilisateur depuis 2 ans de Docker et de la Raspberry Pi, il vous propose aujourd’hui un article sur le sujet.
Nous remercions Franck d’avoir pris le temps d’écrire un article pour Raspbian France entre l’écriture d’articles sur son site et autres tentatives pour convertir son fils à la Raspberry Pi !
Pour ceux travaillant dans le domaine informatique, Docker et les containeurs nous sont devenus familiers depuis plus d’un an et notamment pour les équipes de développement. Il s’agit en effet d’une technologie créée par un français expatrié aux États-Unis (Solomon Hykes) et qui a pris son envol en 2014 au point de devenir une des start-ups les plus en vue de la Silicon Valley.
Mais que sont les containeurs et en particulier Docker ?
Plutôt que de ré-inventer une définition, je vais simplement paraphraser cette publication.
Les containeurs permettent d’ « automatiser le déploiement de code applicatif en embarquant, dans un « container », toutes les dépendances nécessaires à son exécution ».
Pour faire simple, Docker est comparable dans le monde du développement à ce que sont les apps et le store dans le monde Apple.
Cette comparaison est particulièrement intéressante. Imaginez que le Raspberry est un iPhone et que Docker et son catalogue sont les apps et l’App Store, plus besoin d’installer des packages, de les configurer, de les débogguer. Il suffit juste d’installer les containeurs et le tour est joué.
Cela est certes peu utile si vous n’avez qu’un seul Raspberry Pi mais je suppose que comme beaucoup d’entre nous, au fil du temps, vous en aurez 2 puis 3 puis 5 puis 10 et ce pour des usages complètement différents. Docker permet de simplifier la gestion de tous ces Raspberry.
Comment Docker va vous simplifier la vie?
Il y a tout d’abord les bénéfices reconnus de cette technologie. La première est sans aucun doute la portabilité. Quelque soit la distribution de linux que vous utilisiez (Raspbian, ArchLinux, Alpine, Hypriot…), pour peu que Docker ait été porté dessus, vous pourrez faire tourner les containeurs. Par exemple vous pouvez exécuter des containeurs basés sur Alpine Linux sur une Raspbian et vice-versa. C’est très très pratique quand certaines distro disposent de packages que d’autres n’ont pas comme le serveur Plex absent d’Alpine Linux.
Le deuxième aspect important c’est la réplicabilité grâce à la standardisation. Tout bon containeur qui se respecte est construit à partir d’un fichier de construction nommé Dockerfile. Ce fichier décrit en détail comment le containeur est construit et, en règle générale, il est stocké en ligne (par exemple dans Github) avec tous les composants nécessaires à la construction comme les fichiers binaires, de configuration…
On sait donc exactement comment le containeur est construit, ce qu’il y a dedans et on peut repartir de cette base pour créer son propre containeur, par exemple avec des paramètres différents ou d’autres ajouts.
Une fois le containeur défini et créé, il est stocké sur le « store » de Docker appelé DockerHub.
Ne vous attendez pas à quelque chose d’aussi sexy que l’AppleStore mais il a le mérite de centraliser les images, de lister le nombre de downloads… Seul vrai bémol cependant : il est très difficile de trouver les images spécifiques au Raspberry (généralement leur nom commence par ‘rpi-‘ ou ‘armhf-‘).
Dernier point, chaque fois que vous déploierez un containeur à partir de son image sur votre Rasp, vous partirez du même point de départ, ce qui est extrêmement pratique dans des phases de conception, de recherche…
Enfin, le point quasiment le plus important pour les personnes un peu fainéantes comme moi, c’est la rapidité de déploiement. Pas besoin d’aller rechercher les packages ou de se creuser les méninges sur comment installer, paramétrer un service. Tout est dedans et normalement décrit en détail sur le Hub. En utilisant une interface graphique comme Shipyard, il est possible de gérer le cycle de vie de ces services en quelques clics.
Mais qu’apporte vraiment Docker au Raspberry Pi ?
Le Raspberry est vraiment une fantastique boîte à outils et on peut couvrir 80% de nos besoins informatiques (NAS, routeur, serveurs vidéo, serveur Minecraft…). Mais son succès induit également quelques contraintes :
- Limitation en ressources : un Raspberry ne peut exécuter qu’un ensemble limité de services ce qui conduit à une prolifération (que ceux qui en ont plus de 5 Raspberry lève la main !)
- Exploitabilité : c’est une conséquence du point précédent car plus le nombre de Raspberry est élevé, plus il est pénible de les gérer. Cependant il y a un autre aspect important : un Raspberry vit sa vie tout seul pendant des mois voire des années au fond d’un placard sans qu’on y touche jusqu’au jour où il y a problème et là il faut se rappeler comment il a été construit !
Docker apporte une aide précieuse pour solutionner ces problèmes.
D’abord sur la limitation des ressources. Docker permet d’activer et de désactiver très simplement un containeur avec une fonction start / stop qui peut même être exécutée via l’interface Shipyard mentionnée ci-dessus. C’est un peu comme sur l’iPhone en appuyant 2 fois sur le bouton central et en glissant l’app à arrêter vers le haut.
C’est extrêmement pratique quand vous voulez avoir un Raspberry utilisé pour partager des fichiers, comme serveur d’impression ou pour l’utiliser en résident ou en mobilité. Pas besoin de longues lignes de commandes, un simple clic suffit pour activer ou désactiver le service.
Autre contribution de Docker pour aider à mieux gérer les ressources : certaines distributions comme Alpine Linux sont résolument dédiées à limiter les tailles disque et mémoire nécessaires pour un service. Il est ainsi fréquent de voir des containeurs d’une taille inférieure à 15 Mo ce qui permet en théorie d’en mettre une cinquantaine sur un Raspberry.
Enfin Docker bénéficie d’un système de clustering (création de grappes de plusieurs Raspberry) appelé Swarm qui permet de gérer un ensemble d’hôtes comme un pool de ressources unique. Vous voulez rajouter un Raspberry à votre pool, rien de plus simple ! Il suffit de rajouter un noeud au cluster Swarm et votre Raspberry vient s’ajouter à votre configuration existante. Vous verrez dans la section ci-dessous quelques exemples d’utilisation de plusieurs dizaines de Raspberry pour créer des clusters plutôt conséquents.
Sur le front de l’exploitabilité, la simplicité d’activation et de désactivation des containeurs et la gestion centralisée du cluster via une interface graphique (cf ci-dessous) rendent vraiment votre vie beaucoup plus simple surtout si vous avez de nombreux Raspberry.
Pour utiliser maintenant cette configuration depuis quelques semaines, ce sont vraiment les 2 principaux bénéfices obtenus : c’est simple à gérer notamment les Raspberry déployés chez d’autres membres de la famille et je peux en mettre beaucoup plus sur un seul grâce à l’empreinte minimale des containeurs basés sur Alpine Linux.
Un bémol quand même à tout cela : tout n’est pas aussi simple qu’un iphone et il y a encore du chemin à parcourir. Installer un cluster Swarm de Raspberry avec l’interface graphique Shipyard demande un peu de travail mais le résultat en vaut vraiment la peine.
Justement comment faire pour utiliser Docker sur vos Raspberry Pi ?
Le plus simple est d’utiliser la distribution dédiée à Docker et construite par l’équipe Hypriot (@Hypriot) qui maintient un blog très détaillé et met à disposition des mises à jour environ une fois par mois cadencées sur les releases de Docker. L’équipe est très réactive si vous avez des questions. Autre point important : ils maintiennent des images pour quelques containeurs importants sur le Hub.
À titre personnel, j’utilise leur distribution téléchargeables ici, mais je n’utilise pas leurs containeurs, trop gourmants à mon goût. Leur distribution étant basée sur Raspbian, tout ce que vous connaissez, reste entièrement valable et ils mettent également à disposition les containeurs pour Swarm. Bref c’est le must à mon goût !
Une autre option est de partir d’Alpine Linux qui dispose de Docker depuis mi-décembre mais je ne l’ai pas testée personnellement même si elle présente l’avantage d’avoir une empreinte très minime (76 mo contre 451 mo pour Hypriot OS).
A voir donc !
Sinon voici le détail d’un set-up complet possible :
Raspberry Pi avec au moins 512 mo de mémoire + Hypriot OS release 132854 du 15/11/2015 + Docker 1.9.1 + Swarm 1.0.0 + Shipyard 3.0.2 + Registry 0.9.1 |
Des exemples concrets
De nombreux exemples sont disponibles sur le web mais la récente conférence Docker (@dockercon) de Barcelone a apporté une foule d’exemples de l’utilisation de containeurs Docker sur le Raspberry Pi.
En voici quelques-uns:
- [1] Comment faire tourner 2,500 serveurs web sur un Raspberry Pi 2 ?
- [2] Un cluster de 120 Raspberry à la DockerCon 2015
- [3] Ou bien encore un cluster de Raspberry pour vos labs par Hypriot
Comme toujours, la seule vraie limite reste notre imagination !
Un exemple plus personnel
Chaque hôte disposant d’un containeur Docker se connecte sur le maître du Cluster Swarm via VPN et participe ensuite à l’ensemble du cluster. A noter l’utilisation de tags pour assurer les règles d’affinité avec le type de processeur. Au-dessus de Swarm, l’outil Shipyard assure l’interface graphique pour un accès web distant. Evidemment tous ces composants sont déployés sous forme de containeurs ce qui permet de déployer un Raspberry en une dizaine de minutes environ.
Tout cela m’aide à :
- déployer de manière centralisée les containeurs Docker sur les Raspberry
- arrêter, démarrer, se connecter en console, analyser chaque containeur
- vérifier si un Raspberry est toujours opérationnel
- disposer d’une bibliothèque personnelle d’images dédiées au Raspberry
Des données de performances sont normalement disponibles mais impossible de faire fonctionner ce service.
Voici un exemple tout bête : je peux très simplement arrêter les services de streaming vidéo sur mon Raspberry et lancer à la place le serveur Minecraft qui nécessite une grosse partie des ressources. A la fin de la partie des enfants, hop, le service Minecraft est simplement arrêté via l’interface graphique et l’autre démarré.
En synthèse, une gestion de plusieurs Raspberry d’une simplicité enfantine grâce à Docker !
N’hésitez pas à partager vos expériences et vos cas d’usage.
Bonne dégustation de framboises !
Bonjour a tous,
Je cherche à faire un containers docker avec de la retro-pi dedans.
Mon but et de pouvoir faire sortir le signal video et audio sur ma TV.
Comment suis-je arriver a déporter cela ?
Merci !
Oulah, c’est une demande compliquée. Je te conseils d’aller sur le forum tu trouveras plus facilement des gens compétents sur le sujet pour t’aider.
Bonjour,
Je découvre Docker lors d’une formation. Je me rend compte de la possibilité de mutualiser plusieurs raspberry grace à Docker Swarm. Je vois sur votre article que vous confirmer ce fait. D’autan plus que vous parler de Minecraft. Et oui, la Raspberry est juste suffisante pour Minecraft.
Est-il envisageable de mutualiser 2 (ou plus) raspberry pour faire fonctionner un seul et même serveur Minecraft plus puissant ?
A ce jour, je ne dispose que d’une seule framboise, mais j’avais d’en l’idée de m’en offrir quelques une de plus, ne serait-ce que pour tester Docker Swarm. Mais autant m’en servir pour Minecraft si c’est possible.
Merci de me confirmer ou pas cette possibilité.
Cordialement.
Salut, nous n’avons jamais essayé un cas comme celui-ci et nous ne sommes pas experts en Docker, loin de là. Tu trouverais peut-être de l’aide sur notre forum.
Bonjour,
j’aimerai beaucoup tester la config que vous proposez en particulier shipyard sur le raspberrypi.
Est ce que vous pourriez m’indiquer comment installer shipyard sur le rpi ?
Merci
Bonjour,
Perso grosse galère avec l’image OS de chez Hypriot, échec total.
Donc installation d’une 2016-05-27-raspbian-jessie sur mon Pi et après
wget https://downloads.hypriot.com/docker-hypriot_1.10.3-1_armhf.deb
dpkg -i docker-hypriot_1.10.3-1_armhf.deb
ensuite on test avec :
docker run -d -p 80:80 hypriot/rpi-busybox-httpd
là au moins ça marche… j’espère que ça pourra aider certain 😉
Salut,
Merci pour ton retour ! 😉
Merci pour ce très bon article.
J’avais mis docker sur un de mes Raspberry Pi le soir même de ma lecture de cet article avec Hypriot. Il me reste encore du chemin à faire avant de déployer mes containers : mettre docker sur mes autres RPI, avoir Swarm pour les répartir, etc.
Un point qui me semble nébuleux même après plusieurs heures de lecture : comment faire pour avoir des Raspberry à plusieurs endroits dans le même cluster Swarm ? Comment faire pour les piloter depuis une VM AWS ? Je ne suis pas sûr d’avoir compris comment cette architecture fonctionne mais j’aimerai bien en faire une similaire. Si vous pouviez m’aiguiller, cela m’aiderait.
Mais encore bravo pour l’article qui m’a redonné envie de jouer avec mes Raspberry 😉
Oui, cette Alpine Linux est vraiment fantastique. J’ai essayé de construire un environnement XFCE en bureau distant sur un containeur Raspbian : au bout d’une heure il y était encore. Avec Alpine Linux : 5 minutes
Je poste régulièrement des containeurs à base d’Alpine ici : http://besn0847.blogspot.fr/2016/01/docker-personal-image-catalog-for.html
Le prochain sera un poste type VDI 🙂
Plus le temps passe, plus la combinaison : Raspberry / Raspbian / Docker / Alpine me laisse penser que je vais virer mon dernier PC et ma souscription AWS (pour le même prix, j’ai 4 rasp en plus par an !).
Concernant Alpine, je peux te confirmer quelle est vraiment légère et efficace. J’ai crée 2 images l’utilisant. Une image de base + Python et une image pour le projet gitcheck. Plus d’info ici => https://github.com/badele/docker-recipes
Bonjour,
Très bon article expliquant bien le principe des conteneurs.
A titre d exemple voici mes conteneurs docker pour fabriquer un serveur websig wifi autonome sur raspberry pi 2:
https://github.com/jancelin/geo-poppy