Installer Docker sur un VPS KVM (et ses limites en LXC)
Docker permet de lancer une application et toutes ses dépendances dans des conteneurs isolés, décrits dans un fichier compose.yaml. Sur un VPS machine virtuelle (KVM), qui a son propre noyau, Docker s'installe comme sur n'importe quel serveur Linux. Ce guide couvre l'installation, la publication d'un conteneur sur votre adresse HTTPS et les pièges propres à l'accès des VPS HebergHub.
LXC ou machine virtuelle ?
À la commande d'un VPS, la liste des systèmes propose chaque distribution en conteneur LXC ou en machine virtuelle, au même prix. La différence compte pour Docker :
- machine virtuelle (KVM) : votre propre noyau, Docker fonctionne sans réglage particulier ;
- conteneur LXC : Docker y serait un conteneur dans un conteneur. Cela dépend d'options du conteneur côté hyperviseur (l'imbrication, nesting) et des fonctions du noyau partagé.
Si Docker est au cœur de votre projet, choisissez une machine virtuelle. Le guide LXC ou KVM : choisir détaille les autres différences.
1. Préparer le VPS
Connectez-vous en SSH (voir Première connexion SSH par clé) et mettez le système à jour :
apt update && apt full-upgrade -yRetirez d'éventuels paquets Docker non officiels installés auparavant :
apt remove -y docker.io docker-compose docker-doc podman-docker containerd runc 2>/dev/null2. Installer Docker Engine depuis le dépôt officiel
Le dépôt de Docker fournit des versions récentes de Docker Engine et du plugin Compose.
Debian 12 ou 13 :
apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/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/debian $(. /etc/os-release && echo "$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-pluginUbuntu 24.04 : mêmes commandes, en remplaçant les deux occurrences de linux/debian par linux/ubuntu et la source de VERSION_CODENAME par UBUNTU_CODENAME.
Vérifiez :
docker run --rm hello-world
docker compose versionAlternative plus simple, avec des versions moins récentes : les paquets de Debian (apt install docker.io docker-compose).
3. Limiter la taille des journaux
Par défaut, Docker garde les journaux de chaque conteneur sans limite de taille : sur un disque de 20 à 80 Go, ils finissent par le remplir. Fixez une limite :
cat > /etc/docker/daemon.json <<'EOF'
{
"log-driver": "local",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
EOF
systemctl restart dockerLa limite s'applique aux conteneurs créés après le changement.
4. Publier une application sur votre adresse HTTPS
Votre VPS est publié en HTTPS sur nom.vps.heberghub.fr : le certificat est géré par le point d'entrée, et votre VPS reçoit le trafic en HTTP sur son port 80. Il suffit donc qu'un conteneur réponde sur le port 80.
Exemple avec compose.yaml :
services:
web:
image: nginx:stable
ports:
- "80:80"
volumes:
- ./site:/usr/share/nginx/html:ro
restart: unless-stoppedmkdir -p /opt/mon-site/site && cd /opt/mon-site
echo "Bonjour depuis Docker" > site/index.html
nano compose.yaml # contenu ci-dessus
docker compose up -d
docker compose psOuvrez https://nom.vps.heberghub.fr. Pour plusieurs applications, placez un relais (nginx, Caddy, Traefik) sur le port 80, qui répartit par nom de domaine vers les autres conteneurs.
N'installez pas de certificat pour nom.vps.heberghub.fr dans le VPS : il est déjà géré en amont. Votre application reçoit l'en-tête X-Forwarded-Proto: https.
Les autres ports
Pour exposer un autre service (une base accessible de l'extérieur, un serveur de jeu, une API sur un port dédié), ouvrez un port public depuis l'espace client : 10, 20 ou 50 ports selon la formule.
5. Le piège du pare-feu
Docker contourne les règles ufw. Un port publié avec -p 5432:5432 ou ports: - "5432:5432" est ouvert sur toutes les interfaces par des règles que Docker insère lui-même, avant celles d'ufw. ufw status ne le montre pas.
Les bonnes pratiques :
- ne publiez que ce qui doit être joint de l'extérieur ;
- pour un service interne (base de données, cache), ne publiez pas de port : les conteneurs d'un même fichier Compose se joignent par leur nom de service sur le réseau Docker ;
- si un port doit être joint seulement depuis le VPS lui-même, liez-le à la boucle locale :
"127.0.0.1:5432:5432".
Avec nftables, attention à la ligne flush ruleset en tête de /etc/nftables.conf (celle du guide Configurer un pare-feu) : un redémarrage de nftables efface aussi les règles de Docker, et les conteneurs perdent leurs ports publiés jusqu'au prochain systemctl restart docker. Sur un VPS qui fait tourner Docker, le plus simple est de ne publier que les ports nécessaires et de ne pas ajouter de pare-feu par-dessus, ou de redémarrer Docker après chaque rechargement des règles.
6. Entretenir
docker compose pull && docker compose up -d # mettre à jour les images
docker image prune -f # supprimer les images inutilisées
docker system df # place occupée par Docker- Les données qui comptent vont dans des volumes ou des dossiers montés, jamais seulement dans le conteneur : un conteneur recréé repart de son image.
- Les VPS ne sont pas sauvegardés automatiquement. Sauvegardez vos volumes et vos fichiers
compose.yamlhors du VPS. - Les secrets se passent par un fichier
.envà côté decompose.yaml(lisible par root seul), pas en clair dans le fichier Compose versionné. Voir Variables d'environnement et jetons.
À savoir
- Les ports d'envoi de mail (25, 465, 587) sont bloqués en sortie : un conteneur de serveur mail ne pourra pas envoyer. Utilisez un service d'envoi par API.
- Le VPS n'a pas d'IPv6 pour l'instant : inutile d'activer IPv6 dans Docker.
- Pour une application simple déployée depuis Git, sans administrer de serveur, l'hébergement applicatif construit et publie votre Dockerfile pour vous.
Besoin d'aide ?
Ouvrez un ticket depuis votre espace client avec le nom du VPS, la commande lancée et le message d'erreur complet.