Docker emballe votre application avec tout ce dont elle a besoin, langage, bibliothèques, configuration, dans un conteneur qui tourne de la même façon sur votre poste et sur votre serveur. Sur un VPS Ubuntu, il suffit d'installer Docker, de décrire votre application dans un fichier Docker Compose, puis de la lancer d'une commande. Deux points demandent de l'attention : publier l'application derrière un proxy en HTTPS, et savoir que Docker contourne par défaut les règles du pare-feu UFW.
Ce guide suppose un serveur Ubuntu 24.04 avec un accès SSH, déjà réglé selon notre article premier jour avec votre serveur VPS.
Quelle taille de serveur ?
Docker lui-même consomme peu. Comptez la mémoire de vos conteneurs : une petite API Node.js ou Python tient dans 1 Go, une application avec sa base de données PostgreSQL et un cache Redis sera plus à l'aise avec 2 à 4 Go. La formule à 2 CPU, 2 Go et 50 Go convient à la plupart des premiers déploiements ; elle s'agrandit plus tard sans réinstaller. Voir les tailles et les prix.
Étape 1 : installer Docker
Le plus simple est d'utiliser le dépôt officiel de Docker, qui fournit des versions à jour. Le script d'installation officiel configure ce dépôt pour vous :
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
Vérifiez ensuite l'installation :
docker --version
docker compose version
Pour lancer Docker sans sudo, ajoutez votre utilisateur au groupe docker, puis reconnectez-vous. Sachez que ce groupe donne des droits équivalents à root : ne l'accordez qu'aux administrateurs.
sudo usermod -aG docker $USER
Étape 2 : décrire l'application avec Docker Compose
Docker Compose décrit dans un seul fichier tous les conteneurs de l'application et leurs liens. Créez un dossier, par exemple ~/monapp, et un fichier compose.yaml :
services:
app:
image: monregistre/monapp:1.0
restart: unless-stopped
environment:
DATABASE_URL: postgres://app:motdepasse@db:5432/app
ports:
- "127.0.0.1:3000:3000"
depends_on:
- db
db:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: motdepasse
POSTGRES_DB: app
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
Trois détails comptent :
- restart: unless-stopped relance les conteneurs après un redémarrage du serveur ;
- le volume db-data garde les données de la base hors du conteneur : vous pouvez mettre à jour ou recréer le conteneur sans rien perdre ;
- 127.0.0.1:3000:3000 publie l'application uniquement sur le serveur lui-même, pas sur internet. On y revient plus bas.
Dans un vrai projet, mettez les mots de passe dans un fichier .env à côté, jamais dans un dépôt Git.
Étape 3 : lancer
cd ~/monapp
docker compose up -d
docker compose ps
docker compose logs -f app
La première commande télécharge les images et démarre les conteneurs en arrière-plan. Les deux suivantes montrent leur état et les journaux de l'application.
Étape 4 : publier en HTTPS derrière un proxy
Plutôt que d'exposer le port 3000, placez devant l'application un proxy inverse, Nginx, Caddy ou Traefik, qui reçoit le trafic sur les ports 80 et 443, gère le certificat SSL et transmet les requêtes à l'application. Caddy est le plus simple à démarrer : il obtient et renouvelle seul les certificats Let's Encrypt.
Pointez d'abord votre domaine vers l'adresse IPv4 publique du serveur, puis configurez le proxy pour renvoyer votre domaine vers 127.0.0.1:3000. Notre article le DNS expliqué simplement détaille la partie DNS.
Le piège du pare-feu
C'est la surprise classique : vous activez UFW, vous n'autorisez que SSH, 80 et 443, et pourtant un conteneur publié avec « 5432:5432 » est joignable depuis internet. Docker écrit ses propres règles réseau, qui passent avant celles d'UFW.
Les parades :
- publiez les ports sur 127.0.0.1, comme dans l'exemple, quand seul le proxy doit y accéder ;
- ne publiez pas du tout les ports des bases de données : les conteneurs d'un même fichier Compose se parlent entre eux par leur nom, ici db ;
- pour faire communiquer plusieurs serveurs, utilisez un réseau privé plutôt qu'internet. Chez PassRoyal, les réseaux privés sont inclus, jusqu'à huit par serveur.
Mettre à jour l'application
docker compose pull
docker compose up -d
docker image prune -f
Les conteneurs sont recréés avec la nouvelle image ; les volumes, eux, restent en place. Pour revenir en arrière, il suffit de remettre l'ancien numéro de version dans compose.yaml. D'où l'intérêt de toujours préciser une version d'image plutôt que latest.
Sauvegarder
Sauvegarder un serveur Docker, c'est sauvegarder trois choses : vos fichiers compose.yaml et .env, le contenu des volumes, et pour les bases de données, un export régulier fait avec l'outil de la base, plus fiable qu'une copie des fichiers à chaud. Envoyez le tout hors du serveur : les serveurs PassRoyal ne sont pas sauvegardés par défaut. Voir sauvegarder un serveur : à quelle fréquence, et où.
Questions fréquentes
Docker ralentit-il mon application ?
Non, de façon perceptible. Un conteneur n'est pas une machine virtuelle : il partage le noyau du serveur et tourne presque à la vitesse d'un programme installé directement.
Puis-je utiliser Docker avec Passroyal Panel ?
Le panneau fait déjà tourner les applications Node.js chacune dans son conteneur. Pour vos propres conteneurs, la machine est la vôtre ; évitez seulement d'occuper les ports 80 et 443 dont le panneau se sert pour vos sites.
Et ensuite ?
Composez le serveur qui accueillera vos conteneurs, avec l'accès root et des réseaux privés inclus, sur la page cloud computing.