Ce guide s'appuie sur la documentation de Docker sur les volumes et sur celle de Docker Compose, relues le 15 octobre 2026. Les commandes supposent une application lancée avec docker compose, dans un dossier ~/monapp.
1. Faire l'inventaire sur l'ancien serveur
- Listez les projets Compose, arrêtés compris :
docker compose ls --all - Dans le dossier de chaque projet, listez ses conteneurs :
docker compose ps - Pour chaque conteneur, affichez ses montages réels :
docker inspect --format '{{json .Mounts}}' nom-du-conteneur. Le formatjsond'un champ est décrit dans la documentation de docker inspect. - Notez pour chaque montage son type (
volumeoubind), son nom s'il s'agit d'un volume, saSource, le chemin sur le serveur, et saDestination, le chemin dans le conteneur. - Ouvrez le fichier compose et notez les ports publiés, les réseaux déclarés
externalet les images utilisées.
L'inventaire par docker inspect est le seul complet. Un volume anonyme, créé par une image sans nom dans le fichier compose, porte un nom fait de chiffres et de lettres, sans le préfixe du projet. Un dossier monté peut se trouver hors du dossier du projet, par exemple sous /srv. Les deux s'oublient facilement.
Vérifiez aussi que chaque image porte une étiquette de version précise, par exemple postgres:16 plutôt que postgres:latest. Le nouveau serveur doit lancer la même version que l'ancien, sans quoi une base copiée telle quelle peut refuser de démarrer.
2. Arrêter et archiver
Prévenez vos utilisateurs : l'application est indisponible de l'arrêt jusqu'à la bascule. Les fichiers d'une base appartiennent souvent à un autre utilisateur que le vôtre, d'où sudo : il lit tous les fichiers, et l'option p de tar garde leurs droits, --numeric-owner leurs propriétaires.
- Dans le dossier du projet, arrêtez l'application sans supprimer les conteneurs :
docker compose stop - Créez un dossier pour les archives :
mkdir ~/migration - Archivez le dossier du projet, dossiers montés à l'intérieur compris :
sudo tar czpf ~/migration/projet.tar.gz --numeric-owner -C ~ monapp - Archivez chaque volume, nommé ou anonyme, à partir de la
Sourcerelevée :sudo tar czpf ~/migration/donnees.tar.gz --numeric-owner -C /var/lib/docker/volumes/monapp_donnees/_data . - Archivez de la même façon chaque dossier monté hors du projet, en remplaçant le chemin après
-Cpar saSource. - Rendez les archives lisibles par votre compte, pour pouvoir les copier :
sudo chown -R "$USER": ~/migration
Notez, pour chaque archive, la Destination du montage qu'elle contient : c'est elle qui permet de retrouver le bon volume sur le nouveau serveur.
Pour une base de données, un export par l'outil de la base ajoute une sécurité : un fichier SQL se relit avec n'importe quelle version récente du moteur. Les commandes pour PostgreSQL, MySQL et MariaDB sont dans Sauvegarde Docker : conteneurs et volumes.
3. Copier les archives sur le nouveau serveur
- Si l'ancien serveur peut se connecter au nouveau par clé SSH, envoyez le dossier directement :
rsync -avz ~/migration admin@nouveau-serveur:~/ - Sinon, passez par votre ordinateur : rapatriez le dossier avec
rsyncouscp, puis renvoyez-le vers le nouveau serveur.
Les archives contiennent le fichier .env, qui porte le plus souvent des mots de passe. Ne les faites jamais transiter par un service de partage ou un dépôt Git, et supprimez-les une fois la migration vérifiée.
4. Restaurer sur le nouveau serveur
- Créez d'abord chaque réseau déclaré
externaldans le fichier compose, sans quoi l'étape suivante échoue :docker network create proxy, ou installez le reverse proxy qui le crée. - Restaurez le dossier du projet, sous le même nom :
sudo tar xzpf ~/migration/projet.tar.gz --numeric-owner -C ~, puis vérifiez que~/monapp/.envest bien là. L'option--numeric-ownera rendu au dossier le numéro d'utilisateur de l'ancien serveur : sils -ln ~/monappmontre un autre propriétaire que le vôtre, reprenez la main sur le dossier et sur les fichiers posés à sa racine (fichier compose,.env), sans toucher aux dossiers de données montés à l'intérieur :sudo chown "$USER": ~/monapp, puissudo find ~/monapp -maxdepth 1 -type f -exec chown "$USER": {} +. Protégez enfin le fichier avecchmod 600 ~/monapp/.env. - Dans le dossier du projet, créez conteneurs et volumes sans démarrer les services :
docker compose up --no-start - Relevez les nouveaux montages avec
docker inspect --format '{{json .Mounts}}' nom-du-conteneur. Un volume anonyme a changé de nom : retrouvez-le par saDestination. - Décompressez chaque archive dans la
Sourcede son volume :sudo tar xzpf ~/migration/donnees.tar.gz --numeric-owner -C /var/lib/docker/volumes/monapp_donnees/_data - Pour un dossier monté hors du projet, recréez son chemin avec
sudo mkdir -p, puis décompressez son archive de la même façon. - Démarrez l'application :
docker compose up -d - Contrôlez les journaux au démarrage :
docker compose logs -f, puisCtrl+Cpour en sortir.
Si un volume avait déjà été initialisé par un premier démarrage, videz-le avant de restaurer : mélanger deux bases dans un même dossier donne un résultat imprévisible.
5. Tester, puis basculer
- Testez l'application avant de toucher au DNS, par exemple en associant le domaine à l'adresse du nouveau serveur dans le fichier
hostsde votre ordinateur. - Ouvrez sur le nouveau serveur les ports dont l'application a besoin, en plus de ceux du reverse proxy.
- Remplacez l'adresse IP des enregistrements DNS du domaine par celle du nouveau serveur : voir Pointer un nom de domaine vers son VPS. Un TTL baissé la veille raccourcit l'attente.
- Gardez l'ancien serveur quelques jours, éteint ou arrêté, comme copie de secours.
La migration VPS offerte chez Hubspace
Pour un VPS Hubspace, la migration VPS est offerte sur toutes les tailles. Vous nous donnez un accès SSH à votre serveur actuel, quel que soit son hébergeur. Nous relevons vos applications, leurs volumes, leurs bases et leurs ports, puis nous convenons avec vous de la taille du VPS et de la date de bascule.
Nous copions ensuite les fichiers compose, les fichiers d'environnement, les volumes et les bases. Pour une base, la copie finale se fait pendant une courte pause des conteneurs, à l'heure convenue. Nous relançons les conteneurs, vous testez, puis vos domaines pointent vers le nouveau VPS. L'ancien serveur reste en place le temps de la propagation.
Ce qui tourne hors de Docker est à réinstaller, l'ouverture d'autres ports que 22, 80 et 443 se fait depuis l'onglet « Firewalls » de votre espace client, et l'administration des applications après la bascule reste à votre charge : voir Ouvrir un port sur son VPS.
Questions fréquentes
Faut-il copier les images Docker ?
Non. Les images se téléchargent à nouveau depuis leur registre au premier démarrage. Seule une image construite par vous et absente de tout registre doit être reconstruite à partir de son Dockerfile, qui fait partie du dossier du projet.
Peut-on migrer sans arrêter l'application ?
Pour des fichiers statiques, oui. Pour une base de données, une copie de ses fichiers en marche peut être incohérente. Faites un export par l'outil de la base pendant que l'application tourne, puis une courte pause pour la copie finale.
Les volumes nommés gardent-ils le même nom sur le nouveau serveur ?
Oui, si le dossier du projet porte le même nom ou si le fichier compose fixe le nom du projet. Compose préfixe chaque volume par le nom du projet : un dossier renommé crée des volumes vides, à côté de ceux que vous avez restaurés. Seuls échappent à ce préfixe, d'après la référence des volumes de Compose, un volume déclaré external, qui doit exister avant le démarrage, et un volume doté d'un name, gardé tel quel.
Articles liés
- Changer d'hébergeur sans coupureChanger d'hébergeur sans couper son site ni perdre de courriels : inventaire, copie, test, bascule DNS, certificat, puis résiliation. L'ordre à suivre.
- Migrer un site WordPress vers un autre hébergeurMigrer un site WordPress : outil d'import de Plesk, extension de migration ou méthode manuelle, puis changement d'adresse et bascule DNS sans couper le site.
- Migrer un site OVH vers un autre hébergeurQuitter un hébergement web OVHcloud : récupérer fichiers et base de données, copier les boîtes mail, décider du sort du domaine, puis basculer sans coupure.