Prérequis
Avant de commencer, les éléments suivants doivent être en place :
- Accès SSH sécurisé par clé : Guide clé SSH
- Pare-feu UFW configuré : Guide UFW (lire aussi la section Docker et UFW ci-dessous avant d'exposer des ports)
- Un utilisateur non-root avec droits sudo, ou accès root direct
- OS : Debian 13 (Trixie) ou Ubuntu 24.04 LTS
Étape 1 : Ajouter le dépôt officiel Docker
Ne pas installer le paquet docker.io fourni par Debian/Ubuntu : il est en retard sur les versions officielles. Utiliser le dépôt Docker Inc. pour obtenir docker-ce, la version maintenue activement.
Sur Debian 13
Source : docs.docker.com/engine/install/debian/
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update Sur Ubuntu 24.04
Source : docs.docker.com/engine/install/ubuntu/
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update Étape 2 : Installer Docker Engine et Docker Compose
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin Ce paquet installe simultanément :
- docker-ce : le moteur Docker
- docker-ce-cli : l'interface en ligne de commande
- containerd.io : le runtime de conteneurs
- docker-buildx-plugin : le plugin de build multi-plateforme
- docker-compose-plugin : Docker Compose v2 (commande
docker compose, sans tiret)
Vérifier l'installation :
docker --version
docker compose version Note importante sur Docker Compose : le plugin v2 s'appelle docker compose (deux mots, sans tiret). L'ancien binaire standalone docker-compose (avec tiret) est la version v1, dépréciée depuis juillet 2023 et non installée ici. Source : docs.docker.com/compose/migrate/
Activer Docker au démarrage du système :
sudo systemctl enable docker.service
sudo systemctl enable containerd.service Source : docs.docker.com/engine/install/linux-postinstall/
Étape 3 : Configurer l'accès non-root
Ajouter l'utilisateur au groupe docker
Par défaut, les commandes Docker nécessitent sudo. Pour les exécuter sans sudo, ajouter l'utilisateur au groupe docker :
sudo usermod -aG docker $USER
newgrp docker La commande newgrp docker applique le changement dans la session courante sans déconnexion. Source : docs.docker.com/engine/install/linux-postinstall/
Avertissement de sécurité sur le groupe docker
Étape 4 : Premier conteneur de test
Vérifier que l'installation fonctionne avec l'image officielle hello-world :
docker run hello-world Docker télécharge l'image depuis Docker Hub si elle n'est pas présente localement, lance un conteneur, affiche un message de confirmation et s'arrête. Une sortie contenant "Hello from Docker!" confirme que l'installation est opérationnelle.
Docker et UFW : le piège à connaître
Ce qui se passe concrètement
Lancer un conteneur avec docker run -p 8080:80 nginx ouvre le port 8080 sur toutes les interfaces réseau du VPS, y compris l'IP publique, même si UFW n'autorise pas ce port. Source : docs.docker.com/engine/network/packet-filtering-firewalls/
La bonne pratique : binder sur 127.0.0.1
Pour exposer un port uniquement en local (accessible depuis le VPS mais pas depuis Internet), binder sur l'interface loopback :
# Commande docker run
docker run -p 127.0.0.1:8080:80 nginx
# Dans un compose.yml
ports:
- "127.0.0.1:8080:80" Le port 8080 est alors accessible uniquement depuis le VPS lui-même (via un reverse proxy Nginx par exemple), et non depuis l'extérieur.
Pour les ports devant rester publics
Utiliser la chaîne DOCKER-USER d'iptables pour filtrer le trafic avant que Docker ne le traite. Ajouter une règle dans /etc/ufw/after.rules ou configurer directement iptables. La documentation officielle détaille cette approche : Restrict connections to the Docker host.
Recommandation pratique
Pour un VPS hébergeant des services web via Docker :
- Binder tous les conteneurs sur
127.0.0.1par défaut - Placer un reverse proxy Nginx devant (ports 80 et 443 gérés par Nginx, pas par Docker directement)
- Ouvrir uniquement les ports 80 et 443 dans UFW (Guide UFW)
- Ne jamais exposer directement les ports de bases de données (3306, 5432, 6379) sur l'IP publique
Maintenance des conteneurs
Nettoyer les ressources inutilisées
Docker accumule des images, conteneurs arrêtés, volumes et réseaux orphelins. Nettoyer régulièrement :
# Supprimer tous les conteneurs arrêtés, images non utilisées, réseaux orphelins
docker system prune
# Inclure aussi les volumes non utilisés (attention : suppression définitive)
docker system prune --volumes Consulter les logs d'un conteneur
# Afficher les logs du conteneur
docker logs nom_du_conteneur
# Suivi en temps réel
docker logs -f nom_du_conteneur
# Limiter le nombre de lignes affichées
docker logs --tail 100 nom_du_conteneur Mettre à jour Docker Engine
sudo apt update
sudo apt upgrade docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin Mettre à jour une image Docker
# Télécharger la dernière version de l'image
docker pull nom_image:tag
# Recréer le conteneur avec la nouvelle image
docker compose pull
docker compose up -d Quelle configuration VPS pour Docker ?
| Usage | RAM recommandée | Offre OuiHeberg |
|---|---|---|
| 1 à 3 conteneurs légers (site, bot, API) | 4 Go | VPS Linux 04G : 7,00 € TTC/mois |
| Stack complète (app + base de données + cache) | 8 Go | Voir la gamme VPS Linux |
| Plusieurs projets ou services lourds | 16 Go+ | Voir la gamme VPS Linux |
Ces estimations supposent des conteneurs en production standard. Les besoins varient selon les images utilisées et le trafic simultané.
Questions fréquentes
Quelle est la différence entre docker.io et docker-ce ?
docker.io est le paquet Docker fourni par les dépôts Debian/Ubuntu. Il est souvent en retard sur les versions officielles et ne reçoit pas les mises à jour aussi rapidement. docker-ce (Community Edition) est le paquet maintenu directement par Docker Inc. via son dépôt officiel. Ce guide utilise docker-ce.
Docker Compose v2 est-il compatible avec les anciens fichiers docker-compose.yml ?
Oui. Le format des fichiers compose.yml (ou docker-compose.yml) est compatible entre v1 et v2. La seule différence visible est la commande : docker compose (v2, plugin) remplace docker-compose (v1, binaire standalone). La syntaxe des fichiers reste identique pour la grande majorité des cas d'usage.
Comment vérifier que Docker fonctionne après redémarrage du VPS ?
sudo systemctl status docker Si Docker est configuré avec systemctl enable docker.service, il démarre automatiquement. Vérifier aussi que les conteneurs sont configurés avec la politique de redémarrage appropriée dans le compose.yml : restart: unless-stopped ou restart: always.
Peut-on utiliser Docker sans accès root ?
Oui, via le mode rootless. Docker peut fonctionner entièrement sans privilèges root, ce qui réduit la surface d'attaque. La mise en place est plus complexe et documentée ici : docs.docker.com/engine/security/rootless/
Comment protéger davantage le daemon Docker ?
Configurer Fail2ban pour protéger l'accès SSH au VPS est une première étape : voir le Guide Fail2ban. Pour Docker lui-même, ne jamais exposer le socket Docker (/var/run/docker.sock) à des conteneurs non de confiance, et ne pas activer l'API Docker TCP sans TLS mutuel.
Docker installé ? Avant la mise en production, passez en revue la sécurisation de votre VPS de A à Z.
