Déplacer docker vers un autre disque USB

Ceci est mon premier post donc soyer indulgent :angel:
Je n’ai pas trouver de poste correspondant mais bon la recherche n’est pas toujours mon fort…

J’utilise un Raspberry Pi 3B avec une carte micro usb de 4Go, avec le temps et les plugins additionnels j’ai rapidement eu une notification de HA pour me dire que l’espace disponible était en voie de disparition :sweat_smile:

Pour ceux qui ont une installation HA en via docker tous les modules de HA sont gérés comme des « container ». Dans mon installation assez basique ceux ci prenait plus de 2,7 Go. Je veux donc déplacer les containers vers un lecteur externe.

La situation initiale:

  • HA en installé via docker
  • Une carte microSD saturée

Pour vérifier la place occupée par HA (ici je vérifie la taille total utilisée par docker):

du -hc /var/lib/docker/

du : Affiche la taille des dossiers et sous-dossier sélectionné
-h: Utilise un format lisible pour l’homme (Ko, Mo, Go)
-c: Affiche le total

Le but: Déplacer les containers vers un autre lecteur USB (une clef USB pour mon cas)

Les étapes:

  • Avoir un nouveau support de stockage (Clé USB, SSD, disque dur)
  • Formatter le nouveau support
  • Choisir un nom fixe pour le nouveau lecteur et monter le support externe au démarrage de linux.
  • Déplacer les container de docker vers le nouveau support et définir ce nouveau répertoire par défaut pour le service docker

Le choix du materiel:
Dans mon cas j’utilise une clef USB car j’en ait déjà une de taille suffisante et qui ne sert pas.
Ce n’est pas l’idéal car la vitesse d’écriture et de lecture n’est pas optimale.
De plus la durée de vie risque de ne pas être très longue.

  • Les SSD: A mon sens le meilleur choix. Peut gourmand en énergie, rapide en accès, lecture et écriture et une bonne durée de vie.
  • Les clef USB: Equivalent au SSD mais moins rapide et offre une durée de vie (nombre d’accès en lecture / écriture) plus faible. Mais peut-être que vous en avez déjà une qui traine dans un tiroir…
  • Le disque mécanique: Consomme plus d’énergie mais fonctionne aussi.

Etape 1: Formatage du nouveau lecteur:

Pourquoi formatter le nouveau disque ?

Déjà pour s’assurer qu’il est vide et que la totalité de sa taille est disponible.
Ensuite pour s’assurer que le format de fichier (la manière dont son écrite les données est optimale pour le système).

Note: cette étape n’est pas obligatoire.

Sous linux (raspberry):
Une fois le nouveau support connecté nous allons le trouver avec la commande lsblk qui va afficher tous les supports de stockage connecté:

pi@raspberrypi:~ $ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1 15.1G  0 disk
└─sda1        8:1    1 15.1G  0 part /mnt/USB_DB
mmcblk0     179:0    0  7.5G  0 disk
├─mmcblk0p1 179:1    0  256M  0 part /boot
└─mmcblk0p2 179:2    0  7.2G  0 part /

Les support amovibles connectés en USB vont se trouver avec la dénomination sd suivi d’une lettre:

  • sda pour le premier
  • sdb pour le second
  • etc

Ensuite nous trouverons des sous-éléments numérotés: il représente les partitions du disque.

Dans mon cas on peut voir sda qui correspond à la clef USB connectée et sda1 qui est la première partition montée sur le point /mnt/USB_DB

Pour formater ma clef USB ou mon nouveau disque j’utilise un utilitaire en ligne de commande: cfdisk

sudo cfdisk /dev/sda

Les partitions existantes sont listée. Dans mon cas je les supprime en sélectionnant la / les partition et en sélectionnant [ Delete ]

Puis je créé une nouvelle partition qui fait tout le disque en sélectionnant [ New ] > [ Primary ].
Je valide les propositions de taille faite par l’outil puisque je veux utiliser toute la place disponible.

Une nouvelle ligne apparait:

>>  /dev/sda1      2048          31620095          31618048          15.1G          83 Linux

Cette ligne contient la nouvelle partition avec son début, sa fin, sa taille et son type (83 est un des systèmes de fichiers appartenant à linux ce qui me conviens).
Si pour une raison ou pour une autre vous souhaiter que que la partition puisse être reconnue par Windows il faudra changer le type pour NTFS ou FAT32 (non recommandé car moins optimisé pour une utilisation sous linux)

Enfin on écrit la nouvelle partition en sélectionnant [ Write ]

Etape 2 : Montage automatique de la clef USB sur un emplacement définit

Bien que le système monte automatiquement les disques externes par défaut je veux m’assurer que ma nouvelle partition soit montée toujours au même endroit:

Création du nouveau point de montage:

sudo mkdir /mnt/POINT_DE_MONTAGE

On peut choisir un autre endroit, par exemple /media/ qui est le dossier utilisé par défaut par Rapsberry lorsque l’on connecte une clef ou un disque.

Pour que notre support se monte à l’endroit choisi à chaque redémarrage on va l’écrire dans le fichier système fstab

On récupère l’identifiant de la partition PARTUUID pour sda1 avec blkid

pi@raspberrypi:~ $ sudo blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="EBBA-157F" TYPE="vfat" PARTUUID="5a81d7a1-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="b3ce35cd-ade9-4755-a4bb-1571e37fc1b9" TYPE="ext4" PARTUUID="5a81d7a1-02"
/dev/mmcblk0: PTUUID="5a81d7a1" PTTYPE="dos"
/dev/sda1: UUID="27de9752-dc60-4197-ae60-7768bc4645d2" TYPE="ext3" PARTUUID="00012ca9-01"

L’identifiant est ensuite ajouter à fstab

sudo nano /etc/fstab

Et on ajouter une nouvelle ligne avec l’identifiant de la partition, le point de montage, le système de fichier (ext3 si vous avez formater la partition en type 83)

PARTUUID=00012ca9-01  /mnt/POINT_DE_MONTAGE     ext3    defaults,auto,users,rw,nofail 0 0

Et voila au redémarrage le nouveau support sera disponible à l’emplacement choisit!
Pour le monter dès maintenant :

sudo mount /dev/sda1 /mnt/POINT_DE_MONTAGE

Etape 3 : Déplacer les container gérés par docker vers le nouveau support
Docker est géré sous forme de service. Nous allons donc déplacer les containers et mettre à jours le service pour pointer vers le nouveau dossier.

  • Création d’un dossier pour le docker au nouvel emplacement
sudo mkdir /mnt/POINT_DE_MONTAGE/NOUVEAU_DOSSIER
  • Mise à jours du service:
sudo nano /lib/systemd/system/docker.service

On modifie la ligne contenant ExecStart
Ancienne valeur :
ExecStart=/usr/bin/docker daemon -H fd:// --containerd=/run/containerd/containerd.sock

Nouvelle valeur:
ExecStart=/usr/bin/docker daemon -g /mnt/POINT_DE_MONTAGE/NOUVEAU_DOSSIER -H fd:// --containerd=/run/containerd/containerd.sock
Un message d’avertissement est affiché à la sauvegarde, c’est normale puis que le service toujours actif est basé sur l’ancienne valeur.

  • Arret du service docker
sudo systemctl stop docker

On vérifie que le service est bien arrêté: ps aux | grep -i docker | grep -v grep. C’est bon si cette commande ne retourne rien.
Pour moi cela n’a pas fonctionné correctement j’ai donc utilisé sudo kill XXXXX avec les numéro de processus retournés par la commande du dessus.

  • Rechargement du service docker avec les nouveaux paramètres
sudo systemctl daemon-reload
  • Copie du dossier docker vers le nouvel emplacement
sudo rsync -aqxP /var/lib/docker/ /mnt/POINT_DE_MONTAGE/NOUVEAU_DOSSIER

Cette étape peut prendre un peut de temps selon la taille de vos container.
P.S: la commande mv doit également fonctionner mais dans le tuto que j’ai suivi on utilisait rsync, donc dans le doute je met celle-ci.

  • Suppression de l’ancien dossier du docker
cd /var/lib/
sudo rm -rf docker/*
  • Redémarrage du service docker
sudo systemctl start docker

Et voila ! :champagne:

Sources utilisés

2 « J'aime »

Merci pour le partage ! :+1:

Très belle initiative d’avoir rédigé un article :heart_eyes:

Bravo super article :wave: :wave: :wave:
Toi, tu vas pas tarder à intégrer le groupe des rédacteurs :grin: