Docker empaquette une application avec tout ce dont elle a besoin pour tourner. Sur un VPS, cela veut dire installer n8n, une base PostgreSQL, un bot Discord ou un outil de supervision en une commande, sans conflit de versions entre eux, et les déplacer d'un serveur à l'autre sans rien réinstaller. Docker Compose décrit l'ensemble dans un seul fichier lisible.
1. Pourquoi Docker sur un VPS
- Isolation : chaque application a ses propres bibliothèques. Mettre à jour l'une ne casse pas l'autre.
- Reproductibilité : le fichier
compose.yamldécrit tout le déploiement. Le même fichier fonctionne sur un autre serveur. - Catalogue : la plupart des logiciels libres publient une image officielle prête à l'emploi.
La contrepartie : un peu de mémoire en plus, et quelques pièges réseau décrits plus bas. Pour un VPS qui fait tourner plusieurs services, le bilan est très largement positif.
2. Installer Docker Engine depuis le dépôt officiel
Les paquets docker.io des distributions sont souvent en retard de plusieurs versions et n'incluent pas toujours Compose. Installez la version officielle de Docker. Retirez d'abord les éventuels anciens paquets :
for p in docker.io docker-doc docker-compose podman-docker containerd runc; do
apt remove -y $p 2>/dev/null
done
Ajoutez ensuite le dépôt de Docker, puis installez :
apt update && apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
. /etc/os-release
curl -fsSL https://download.docker.com/linux/$ID/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/$ID $VERSION_CODENAME stable" \
> /etc/apt/sources.list.d/docker.list
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
La variable $ID vaut ubuntu ou debian selon votre système : la même commande fonctionne sur les deux.
3. Vérifier l'installation
docker run --rm hello-world
docker compose version
La première commande télécharge une image de test et affiche un message de bienvenue. Notez la syntaxe docker compose, avec une espace : c'est la version actuelle, intégrée à Docker. L'ancienne commande docker-compose avec un tiret n'est plus maintenue.
4. Utilisateur et droits
Pour utiliser Docker sans sudo, ajoutez votre utilisateur au groupe docker, puis reconnectez-vous :
usermod -aG docker alex
docker revient à être root sur le serveur : un membre peut monter n'importe quel dossier du système dans un conteneur. N'y ajoutez que des comptes de confiance.5. Premier projet avec Docker Compose
Chaque projet vit dans son propre dossier, avec un fichier compose.yaml. Exemple : l'outil de supervision Uptime Kuma, qui vérifie que vos sites répondent.
mkdir -p /opt/uptime-kuma && cd /opt/uptime-kuma
cat > compose.yaml <<'EOF'
services:
kuma:
image: louislam/uptime-kuma:1
restart: unless-stopped
volumes:
- ./data:/app/data
ports:
- "127.0.0.1:3001:3001"
EOF
docker compose up -d
Trois choix de ce fichier sont des bonnes pratiques à reprendre partout :
- Une version d'image précise (
:1) plutôt que:latest, pour qu'une mise à jour majeure ne s'installe pas sans que vous l'ayez décidé. - Un volume (
./data) pour les données : un conteneur peut être supprimé et recréé à tout moment, seul le volume persiste. - Un port lié à
127.0.0.1: l'application n'est joignable que depuis le serveur, et sera publiée proprement en HTTPS par Nginx.
"3001:3001" est accessible depuis Internet, même si UFW ne l'autorise pas. Liez à 127.0.0.1 tout ce qui n'a pas vocation à être public. Détails dans configurer UFW.6. Exposer une application en HTTPS
Le plus simple est d'utiliser Nginx installé sur le serveur comme point d'entrée unique, avec un bloc par application :
server {
server_name status.monsite.fr;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
listen 80;
}
Les deux lignes Upgrade et Connection sont nécessaires aux applications qui utilisent des WebSockets, comme Uptime Kuma ou n8n. Obtenez ensuite le certificat avec Certbot : voir Nginx et HTTPS. Pour un exemple complet avec base de données, voir installer n8n sur un VPS avec Docker.
7. Limiter la taille des journaux
Par défaut, Docker conserve les journaux des conteneurs sans limite de taille. Un conteneur bavard peut remplir le disque en quelques semaines. Fixez une limite globale :
cat > /etc/docker/daemon.json <<'EOF'
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
EOF
systemctl restart docker
La limite s'applique aux conteneurs créés après ce changement. Recréez les conteneurs existants avec docker compose up -d --force-recreate.
8. Mettre à jour les conteneurs
cd /opt/uptime-kuma
docker compose pull
docker compose up -d
docker image prune -f
Compose ne recrée que les conteneurs dont l'image a changé ; la dernière commande supprime les anciennes images inutilisées. Lisez les notes de version avant de changer de version majeure, surtout pour les bases de données.
9. Sauvegarder
Sauvegardez le dossier du projet, qui contient le fichier Compose et les volumes. Pour une base de données, n'utilisez pas la copie brute des fichiers pendant qu'elle tourne : exportez-la d'abord depuis le conteneur.
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > /var/backups/n8n.sql.gz
Adaptez le nom du service, de l'utilisateur et de la base à votre projet, puis envoyez le tout hors du serveur : voir sauvegardes avec Borg.
10. Commandes utiles
docker compose ps # état des services du projet
docker compose logs -f --tail 100 # journaux en direct
docker compose restart kuma # redémarrer un service
docker compose down # arrêter et supprimer les conteneurs (pas les volumes)
docker stats # consommation CPU et mémoire en direct
docker system df # espace disque utilisé par Docker