Comprendre chaque ligne d'un docker-compose généré
image, restart, user, read_only, cap_drop, volumes, networks, labels Traefik : le docker-compose de Vaultwarden et de Paperless expliqué ligne par ligne, sécurité comprise.
Les fichiers compose.yml créés par Mon serveur et le générateur suivent
tous le même modèle. Une fois que vous avez compris celui-ci, vous savez lire (et modifier) tous les autres.
Si les mots « image » et « conteneur » sont nouveaux pour vous, commencez par Docker expliqué simplement.
Un exemple complet : Vaultwarden
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
user: "1000:1000"
read_only: true
tmpfs:
- /tmp
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
environment:
DOMAIN: https://vault.mondomaine.fr
SIGNUPS_ALLOWED: "false"
ROCKET_PORT: "8080"
TZ: Europe/Paris
volumes:
- ./data:/data
networks:
- traefik
labels:
- traefik.enable=true
- traefik.http.routers.vaultwarden.rule=Host(`vault.mondomaine.fr`)
- traefik.http.routers.vaultwarden.entrypoints=websecure
- traefik.http.services.vaultwarden.loadbalancer.server.port=8080
networks:
traefik:
external: true
Ce qui fait tourner l’application
image: le programme à télécharger et sa version, après les deux-points.latest= la dernière publiée. Une version figée (gitea/gitea:1,postgres:17-alpine) évite les mauvaises surprises lors des mises à jour.container_name: le nom du conteneur dansdocker psetdocker logs vaultwarden.restart: unless-stopped: Docker relance l’application si elle plante ou si le serveur redémarre… sauf si vous l’avez arrêtée vous-même. Ce n’est pas une garantie absolue : voir relancer ses conteneurs après un incident.environment: les réglages de l’application. Leur sens dépend de chaque application (sa documentation fait foi).TZrègle le fuseau horaire.
La sécurité, ligne par ligne
Ces lignes ne changent rien au fonctionnement normal. Elles limitent les dégâts si l’application était piratée.
| Ligne | Effet | Pourquoi pas partout ? |
|---|---|---|
user: "1000:1000" |
L’application tourne avec un utilisateur normal, pas root | Certaines images doivent démarrer en root |
read_only: true |
Le conteneur ne peut pas modifier ses propres fichiers | Beaucoup d’applications écrivent ailleurs que dans leurs données |
tmpfs: /tmp |
Un dossier temporaire en mémoire, pour les applications en lecture seule | — |
no-new-privileges:true |
Un programme piraté ne peut pas devenir administrateur | Incompatible avec les images qui changent d’utilisateur au démarrage |
cap_drop: ALL |
Retire tous les « pouvoirs spéciaux » de root | Seulement sur les images testées sans |
Le générateur n’applique chaque protection que là où l’application la supporte : c’est pourquoi Vaultwarden en a cinq et Paperless une seule. Pour aller plus loin : sécuriser ses conteneurs Docker.
Les données : volumes
volumes:
- ./data:/data
À gauche des deux-points, un dossier du serveur (./data = à côté du compose.yml) ; à droite, où l’application le
voit. Vos données sont à gauche : c’est ce dossier que la sauvegarde copie. Supprimer le conteneur ne supprime
pas ce dossier.
Avec :ro à la fin (/srv/medias:/media:ro), l’application peut lire mais pas modifier : Jellyfin ne risque pas
d’effacer vos films.
Le chemin jusqu’à Internet : networks et labels
networks: - traefik: l’application rejoint le réseau du reverse proxy, pour qu’il puisse lui transmettre les visites. Elle n’a aucun port ouvert sur Internet : tout passe par Traefik.external: true(en bas) : ce réseau existe déjà, créé par Traefik. S’il n’existe pas, vous aurez cette erreur.- Les
labelssont les instructions pour Traefik :traefik.enable=true: publie cette application ;rule=Host(...): pour quelle adresse ;entrypoints=websecure: en HTTPS (le certificat est géré par Traefik) ;loadbalancer.server.port=8080: sur quel port l’application écoute dans son conteneur.
Les applications à plusieurs conteneurs
Paperless a besoin d’une base de données et d’un « broker » (une file d’attente). Extrait :
services:
paperless:
depends_on:
- db
- broker
environment:
PAPERLESS_DBHOST: db
PAPERLESS_DBPASS: "${DB_PASSWORD}"
networks:
- traefik
- default
labels:
- traefik.docker.network=traefik
db:
image: postgres:17-alpine
container_name: paperless-db
environment:
POSTGRES_PASSWORD: "${DB_PASSWORD}"
volumes:
- ./db:/var/lib/postgresql/data
depends_on: démarre la base avant l’application (sans attendre qu’elle soit prête : d’où les messages « database system is starting up », sans gravité).PAPERLESS_DBHOST: db: les conteneurs d’un même fichier se joignent par leur nom de service.${DB_PASSWORD}: la valeur vient du fichier.env(les mots de passe générés).default: le réseau privé de l’application. La base n’est que sur celui-ci : ni Internet ni Traefik ne la voient.traefik.docker.network=traefik: indique à Traefik par quel réseau joindre l’application, puisqu’elle en a deux.
Modifier un fichier sans casser
- Gardez une copie :
sudo cp compose.yml compose.yml.bak. - Respectez l’indentation : deux espaces par niveau, jamais de tabulation.
- Vérifiez :
sudo docker compose config --quiet(pas de message = fichier valide). - Appliquez :
sudo docker compose up -d(ne recrée que ce qui a changé).
Rappel : si vous relancez le script de Mon serveur, il réécrit les compose.yml. Notez vos modifications.
Une commande qui ne marche pas, une explication pas claire ? Signaler une erreur dans cette page.