Infrastructure

Migrer Docker de RHEL 8 vers Debian 13 — Guide complet

Guide pas à pas pour migrer une stack Docker complète de RHEL 8 vers Debian 13 — sauvegarde des volumes, transfert des données, recréation des conteneurs et bascule d'IP.

Table des matières

RHEL 8 a atteint sa fin de support par Docker à partir de la version 29. Si votre infrastructure tourne encore sur RHEL 8 avec Docker, voici comment migrer proprement vers Debian 13 sans coupure de service prolongée.

Pourquoi migrer ?

  • Docker 28 est la version maximale supportée sur RHEL 8
  • Docker 29+ nécessite RHEL 9 ou une distribution alternative
  • Debian 13 (Trixie) supporte Docker 29+ nativement
  • Moins de contraintes de licence que RHEL

Inventaire avant migration

# Lister les conteneurs
docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"

# Lister les volumes
docker volume ls

# Identifier les bind mounts (données hors volumes Docker)
docker inspect $(docker ps -aq) \
  --format '{{.Name}}: {{range .Mounts}}{{.Type}}:{{.Source}}→{{.Destination}} {{end}}'

Exemple de stack à migrer :

Conteneur Données persistantes Méthode
portainer Volume portainer_data Export tar
app-custom Build local + .env Copier sources + rebuild
stateless-tools Aucune Re-pull image
site-web Bind mount /root/site/ Copier dans l’archive home

Étape 1 — Sauvegarder

Archive du home (bind mounts inclus)

# Exclure les caches volumineux et régénérables
tar czf /tmp/home-backup.tar.gz \
  --exclude=/root/jellyfin/cache \
  --exclude=/root/.cache \
  /root

ls -lh /tmp/home-backup.tar.gz

Exporter les volumes Docker

# Pour chaque volume nommé
for vol in $(docker volume ls -q); do
  echo "Exporting $vol..."
  docker run --rm \
    -v "${vol}:/data" \
    -v /tmp:/backup \
    alpine tar czf "/backup/${vol}.tar.gz" /data
done

ls -lh /tmp/*.tar.gz

Étape 2 — Préparer la VM Debian 13

Créez une nouvelle VM (Proxmox ou autre) avec Debian 13 Netinstall, 50 Go de disque.

# Mise à jour système
apt update && apt upgrade -y

# Outils essentiels
apt install -y curl wget git vim sudo openssh-server netcat-openbsd

# Docker via le script officiel
curl -fsSL https://get.docker.com | sh

# Vérifier
docker version
# → Client/Server: Docker Engine 29.x.x

Étape 3 — Transférer les données

# Depuis la VM Debian — récupérer les archives
scp root@ANCIEN-IP:/tmp/home-backup.tar.gz /tmp/
scp root@ANCIEN-IP:/tmp/portainer_data.tar.gz /tmp/

# Extraire le home
tar xzf /tmp/home-backup.tar.gz -C /

# Importer le volume Portainer
docker volume create portainer_data
docker run --rm \
  -v portainer_data:/data \
  -v /tmp:/backup \
  alpine tar xzf /backup/portainer_data.tar.gz -C /

# Vérifier
docker run --rm -v portainer_data:/data alpine ls /data
# → backups bin certs portainer.db ...

Étape 4 — Recréer les conteneurs

Portainer (sans Docker Swarm)

# /root/portainer-compose.yml
services:
  portainer:
    image: portainer/portainer-ee:latest
    container_name: portainer
    restart: always
    ports:
      - "8000:8000"
      - "9443:9443"
    volumes:
      - portainer_data:/data
      - /var/run/docker.sock:/var/run/docker.sock

  portainer_agent:
    image: portainer/agent:latest
    container_name: portainer_agent
    restart: always
    ports:
      - "9001:9001"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes

volumes:
  portainer_data:
    external: true
docker compose -f /root/portainer-compose.yml up -d

Conteneurs stateless

# Pas de données à migrer — juste re-pull et recréer
docker run -d --name it-tools --restart always -p 8080:80 corentinth/it-tools
docker run -d --name srv-kms  --restart always -p 1688:1688 mikolatero/vlmcsd

Conteneur avec build local

cd /root/mon-app
docker compose up -d --build

Étape 5 — Bascule d’IP

Une fois tous les conteneurs vérifiés sur la nouvelle VM :

# 1. Arrêter l'ancienne VM (ne pas la supprimer immédiatement)
# 2. Assigner la même IP à la nouvelle VM (DHCP statique ou config réseau)

# Sur Debian 13 — modifier l'IP
nano /etc/network/interfaces
# Changer l'adresse IP

systemctl restart networking

# 3. Vérifier la connectivité
ip a
ping 8.8.8.8

Étape 6 — Mettre à jour HAProxy si nécessaire

Si les backends pointent vers une IP qui a changé :

# haproxy.cfg — mettre à jour l'IP des backends
backend mon_backend
    server app NOUVELLE-IP:PORT check
haproxy -c -f /etc/haproxy/haproxy.cfg && systemctl reload haproxy

Vérification finale

# Tous les conteneurs doivent être Up
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

# Tester chaque service
curl -sk https://mon-service.domaine.com -o /dev/null -w "%{http_code}"
# → 200

Rollback

# Si problème — rallumer l'ancienne VM
# (gardez-la éteinte 48h avant suppression définitive)
# Remettre l'IP sur l'ancienne VM
# La nouvelle VM reprend son IP d'origine
Zero downtime

En configurant la nouvelle VM sur une IP temporaire et en basculant l’IP uniquement une fois la migration validée, le downtime se réduit au temps du redémarrage réseau (~30 secondes).

Conclusion

La migration RHEL 8 → Debian 13 s’effectue proprement en moins de 2 heures pour une stack standard. La clé : sauvegarder les volumes Docker correctement et ne supprimer l’ancienne VM qu’après 48h de validation en production.

Comments