Aller au contenu
Les 31 fichesFREN中文
Fiches
Partie 2 · fiche 6 sur 6 Niveau : Intermédiaire Durée de lecture : 16 min Plateformes : Linux

Docker : isoler vos projets

Chaque projet dans sa bulle étanche. Docker empêche vos projets de se marcher dessus, contient les dégâts quand l'agent expérimente, et rend vos déploiements reproductibles. Pour débutants comme experts.

Sur cette fiche
  1. 01Pourquoi ça change la vie (surtout avec un agent)
  2. 02Installer Docker
  3. 03Niveau 1, lancer un truc existant (débutant)
  4. 04Niveau 2, un mini-projet à plusieurs services (Docker Compose)
  5. 05Niveau 3, emballer VOTRE projet (le Dockerfile)
  6. 06Niveau expert, durcir l’isolation
  7. 07Questions fréquentes

En bref

Docker range chaque projet dans un conteneur, une boîte légère qui embarque sa propre version de Node ou de Python et ses dépendances : les projets ne se marchent plus dessus, se déploient à l'identique et contiennent les dégâts quand un agent expérimente. On l'installe avec le script officiel (curl -fsSL https://get.docker.com | sudo sh), on lance des images toutes faites avec docker run, on décrit un projet à plusieurs services dans un compose.yml, puis on emballe son propre code avec un Dockerfile. Pour un service exposé, on durcit : utilisateur non root, ressources limitées, ports publiés au strict nécessaire.

À faire avant : Git, GitHub & sauvegardes

Vous allez faire tourner plusieurs projets sur cette machine. L’un est resté sur Node 20, l’autre veut Node 24. Celui-ci a besoin d’une vieille version d’une librairie, celui-là de la dernière. Installés « en vrac » sur le système, ils finissent par se marcher dessus, et vous tombez sur le grand classique : « pourtant ça marchait avant ». Docker règle ce problème une bonne fois : chaque projet vit dans sa propre bulle étanche.

Pourquoi ça change la vie (surtout avec un agent)

Trois raisons, et la troisième est sous-estimée :

  • Fini les conflits de versions. Chaque projet embarque son environnement exact. Node 20 ici, Node 24 là, sans interférence. Vous n’installez plus rien « globalement » qui risque de casser un autre projet.
  • Des déploiements reproductibles. Le conteneur qui tourne chez vous est identique à celui qui tournera en ligne. Le « ça marche sur ma machine » disparaît : votre machine, c’est le conteneur. Ça simplifie énormément la mise en ligne (voir Cloudflare Tunnel).
  • Les dégâts restent dans la boîte. C’est le point clé pour qui bosse avec un agent. Un agent qui expérimente, une dépendance louche, un script qui dérape : enfermés dans un conteneur, ils ne peuvent pas saccager toute la machine. C’est le niveau d’isolation au-dessus du « dossier de projet », un vrai bac à sable par projet (à relier à Sécuriser les accès).

Installer Docker

# La méthode officielle, en une commande
curl -fsSL https://get.docker.com | sudo sh
# Autorise ton utilisateur à piloter Docker sans sudo (déconnecte/reconnecte ensuite)
sudo usermod -aG docker $USER

Vérifiez : docker run hello-world doit télécharger une mini-image et afficher un message de bienvenue. Si vous le voyez, vous êtes prêt.

Niveau 1, lancer un truc existant (débutant)

Le plus beau de Docker au début, c’est que vous profitez du travail des autres. Des dizaines de milliers d’applications sont déjà « emboîtées », prêtes à lancer. Besoin d’une base de données PostgreSQL pour un projet ? Pas d’installation laborieuse :

# Lance une base PostgreSQL isolée, en une ligne
docker run -d --name ma-db -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres:16
docker ps              # voir ce qui tourne
docker logs ma-db      # voir les journaux
docker stop ma-db      # arrêter (docker start ma-db pour relancer)
docker rm ma-db        # supprimer le conteneur (la boîte disparaît proprement)

Niveau 2, un mini-projet à plusieurs services (Docker Compose)

La plupart des projets, c’est plusieurs morceaux : une app + une base de données, par exemple. Docker Compose décrit tout ça dans un seul fichier compose.yml, et lance l’ensemble d’une commande.

# compose.yml, une petite app web + sa base, isolées ensemble
services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - db-data:/var/lib/postgresql/data   # les données survivent aux redémarrages
volumes:
  db-data:
docker compose up -d      # tout démarre, en arrière-plan
docker compose logs -f    # suivre ce qui se passe
docker compose down       # tout arrêter et nettoyer

Niveau 3, emballer VOTRE projet (le Dockerfile)

Pour mettre votre propre code en boîte, vous écrivez un Dockerfile : la recette qui dit comment construire l’image de votre projet.

# Dockerfile, la recette de ta boîte
# (un commentaire Docker tient sur sa propre ligne : un # en fin de ligne serait lu comme un argument)
# On part d'une image Node officielle, légère
FROM node:24-slim
WORKDIR /app
COPY package*.json ./
# Installe les dépendances DANS la boîte
RUN npm ci
COPY . .
EXPOSE 8080
# La commande qui démarre l'app
CMD ["node", "server.js"]
docker build -t mon-app .   # construit l'image à partir du Dockerfile
docker run -d -p 8080:8080 mon-app

Désormais, votre projet et son environnement ne font qu’un. Vous pouvez le lancer sur n’importe quelle machine qui a Docker, à l’identique.

Niveau expert, durcir l’isolation

Le conteneur isole déjà beaucoup, mais par défaut il ne s’arrête pas là où il pourrait. Quand vous hébergez un service exposé, ou que vous confinez un agent, resserrez les boulons :

  • Ne tournez pas en root dans le conteneur : ajoutez un utilisateur non privilégié (USER node) dans votre Dockerfile. Si quelqu’un s’échappe de l’app, il n’est pas root.
  • Système de fichiers en lecture seule : docker run --read-only empêche le conteneur d’écrire là où il ne devrait pas.
  • Limitez les ressources : --memory=512m --cpus=1 empêche un conteneur emballé d’asphyxier toute la machine.
  • Réduisez les privilèges : --cap-drop=ALL retire les capacités Linux inutiles ; vous n’en rajoutez que si nécessaire.
  • Isolez le réseau : ne publiez (-p) que les ports réellement nécessaires ; le reste reste invisible. Et ce que vous publiez vers l’extérieur passe par Cloudflare Tunnel ou reste sur Tailscale, jamais en clair sur Internet.

Questions fréquentes

Quelle différence entre un conteneur Docker et une machine virtuelle ?

Un conteneur est bien plus léger : il partage le noyau Linux de la machine hôte au lieu d'en embarquer un, si bien qu'on peut en lancer dix côte à côte sans qu'ils se gênent. En contrepartie, son isolation est moins forte. Pour confiner du code vraiment risqué, une machine virtuelle, qui ne partage plus le noyau de l'hôte, offre la séparation la plus solide.

Comment utiliser Docker sans taper sudo à chaque commande ?

Ajoutez votre utilisateur au groupe docker avec sudo usermod -aG docker $USER, puis déconnectez-vous et reconnectez-vous. La commande docker run hello-world doit alors télécharger une mini-image et afficher un message de bienvenue : c'est le signe que tout est prêt.

Docker protège-t-il complètement la machine d'un agent IA ?

Il réduit énormément la surface de casse : un agent qui expérimente ou un script qui dérape reste enfermé dans le conteneur. Mais un conteneur partage le noyau de l'hôte et n'est pas une prison inviolable. Pour un agent qui tourne seul sans surveillance, faites tourner le démon Docker sans root avec des conteneurs eux-mêmes non root, voire le tout dans des machines virtuelles.

À quoi servent Portainer et Dokploy ?

Portainer est un tableau de bord web pour Docker : on y voit tous les conteneurs, leurs journaux et leur consommation, et on les démarre, arrête ou redéploie en deux clics. Dokploy va plus loin : c'est une plateforme de déploiement auto-hébergée qui construit et met en ligne vos projets depuis un dépôt Git, avec domaines et certificats. Mieux vaut d'abord apprendre les bases en ligne de commande.

Les données d'une base Docker survivent-elles aux redémarrages ?

Oui, si vous leur donnez un volume. Dans un compose.yml, un volume nommé relié au dossier de données de PostgreSQL garde les données d'un redémarrage à l'autre. Sans volume, un conteneur supprimé disparaît sans laisser de trace.

Les termes de cette fiche : DockerConteneurAgentLinux

Une erreur ?

Une commande ne marche plus, un prix a changé ?

Les outils bougent tous les mois. Dites-moi ce qui cloche dans cette fiche, je corrige et je redate.

Seuls la page, votre message et le contact éventuel sont gardés. Rien d’autre.

Fiche 14 sur 31 · partie 2 aucune fiche lue pour l’instant Ouvrir le sommaire des fiches