Comment installer Docker sur un Raspberry Pi

Comment installer Docker sur un Raspberry Pi

J'ai à la maison un certain nombre de raspberry, ces micro-ordinateurs de la taille d'une carte de crédit. Petits et puissants, il me servent à de multiples utilisations, comme par exemple pour avoir un mediacenter sur un téléviseur trop ancien pour le faire nativement.

J'ai même dernièrement craqué pour le Raspberry Pi 4 sorti le mois dernier (je suis faible face à un nouveau jouet) afin d'en faire un serveur d'application, avec ses 4Go de RAM, il y a de quoi faire.

Après avoir installé une distribution raspbian 10 (buster) "lite" (disponible ici), j'ai décidé d'installer docker dessus afin de faire fonctionner mes applications dans des containers.

Vous trouverez donc ci dessous la manière dont j'ai fait cette installation.

Installation

On commence par installer les prerequis pour docker

#Mise à jour du cache de paquets
sudo apt update

#Installation des binaires nécessaires
sudo apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common

Ensuite, on ajoute le repository (à l'heure où j'écris ces lignes, l'ajout via add-apt-repository renvoie une erreur) :

#Ajout de la clé GPG Docker
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

#Ajout du repository
sudo echo "deb https://download.docker.com/linux/raspbian/ stretch stable" >> /etc/apt/sources.list

On peut ensuite installer docker, avec une petite nuance. En effet dans les packages recommandés se trouve aufs-dkms, ce package ne parvient pas à se compiler correctement sur le raspberry, on doit donc installer docker sans ses paquets recommandés.

#Mise à jour du cache de paquets
sudo apt update
#Installation de Docker sans ses paquets recommandés
sudo apt -y install docker-ce --no-install-recommends

Un petit test avec un "hello-world" nous permet de voir que notre petit docker se porte bien :

root@raspberrypi:/home/pi# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1eda109e4da: Pull complete
Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm32v7)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Bonus à l'installation

Pour être sûr que Docker redémarre en même temps que le raspberry, il faut activer le service associé via systemctl

root@raspberrypi:/home/pi# systemctl enable docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service.

On peut aussi activer la prise en charge de la limite de RAM par container, l'un des intérêt principaux de la containerisation, pour ce faire, on va modifier le fichier /boot/cmdline.txt et y ajouter les commandes suivantes :

rootwait cgroup_enable=me

ce qui donne, pour ma part :

root@raspberrypi:/home/pi# more /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=ac55fd9e-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait cgroup_enable=me

ensuite, il est nécessaire de rebooter le raspberry pour que les modifications soient prises en compte.

Conclusion

A partir de là, vous avez normalement un serveur docker prêt à être utiliser. Il est aussi possible d'installer docker-compose par exemple.

Personnellement, j'ai tenté d'installer kubernetes (pour le sport), mais je ne suis pas parvenu à debugger la stack réseau qui ne parvenait pas à fonctionner, à cause d'un souci dans le pod coredns. Je réessaierai sans doute plus tard.

Il est a noté que certains problèmes que j'ai rencontrés sont sans doute dû à la jeunesse de la version Debian utilisée (Debian sortie le 6 juillet, Raspbian sortie le 10, je l'ai installé le 12), qui veut dire que nombre de packages ne sont pas officiellement disponibles dessus, mais encore sur stretch, ce qui ne garanti pas leur fonctionnement optimal.