Outils pour utilisateurs

Outils du site


docker_compose

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
docker_compose [2025/08/02 16:48] lucdocker_compose [2025/09/09 09:15] (Version actuelle) luc
Ligne 9: Ligne 9:
  
 ===== Fichier de configuration ===== ===== Fichier de configuration =====
 +
 +[[https://docs.docker.com/reference/compose-file/|doc officielle]]
  
 Contient les règles pour décrire le service que l'on souhaite. Il peut être composé de plusieurs containers, de volumes et de networks. Contient les règles pour décrire le service que l'on souhaite. Il peut être composé de plusieurs containers, de volumes et de networks.
Ligne 18: Ligne 20:
 On trouve plusieurs infos sur la structure d'un Compose file. La spécification a évoluée, et certains directives (comme top-level version) sont obsolètes. Je ne vais lister ici que ce qui est à jour à la date de création de cet article (2/08/2025). On trouve plusieurs infos sur la structure d'un Compose file. La spécification a évoluée, et certains directives (comme top-level version) sont obsolètes. Je ne vais lister ici que ce qui est à jour à la date de création de cet article (2/08/2025).
  
-=== top-level instructions ===+=== Elements de config === 
 (/!\ orthographe et casse) (/!\ orthographe et casse)
-> ''name'' : définit le project name 
  
-> ''services'' : (OBLIGATOIRE) A service is an abstract definition of a computing resource within an application which can be scaled or replaced independently from other components. Services are backed by containers. +Top-level :
->> Contient donc des containers, qui sont définis par des arguments: +
->>> Peut contenir une section ''build'' pour construire une image docker. +
->>> ''image'' : spécifie l'image utilisée pour construire le container. [[https://github.com/opencontainers/.github/blob/main/docs/docs/introduction/digests.md|Format de l'adresse de l'image]] : ''[<registry>/][<project>/]<image>[:<tag>|@<digest>]'' +
->>> ''links'' : définit les liens / networks pour être réliés à d'autres containers (?? version simplifiée des networks ??) +
->>> ''ports'' : définit le mapping des ports entre l'hôte et les containers. Syntaxe (avec des ''" "''): ''"[HOST:]CONTAINER[/PROTOCOL]"'', avec  +
->>>> HOST is [IP:](port | range) (optional). If it is not set, it binds to all network interfaces (0.0.0.0). +
->>>> CONTAINER is port | range. +
->>>> PROTOCOL restricts ports to a specified protocol either tcp or udp(optional). Default is tcp. +
->>> ''restart'' : définit la politique de (re)démarrage automatique : "no", always, unless-stopped, on-failure[:max-retries] +
->>> ''secrets'' : pour définir des accès à des secrets comme des certificats, nécessite aussi une définition de secrets en top-level (comme volumes et networks)+
  
-''volumes''permet la configuration de named volumes pour l'application +  * ''name''définit le project name. Servira de préfixe à tout le reste (nom des containers -avec suffixe "-1"-, des networks, des volumes...). Si name n'est pas définitdocker prendra le nom du dossier qui contient le Compose file. Limite : si ''container_name'' est défini, il n'y a pas de préfixe
->> Pour utiliser un volume dans plusieurs servicesil faut que chacun l'exprime explicitement dans l'attribut ''volume'' de ce service +
->> L'attribut ''external'' (true/false) indique que le volume existe déjà et est géré à l'extérieur du Compose file+
  
-> ''networks'' : permet aux services de communiquer entre eux. +  * ''services'' : (OBLIGATOIRE) A service is an abstract definition of a computing resource within an application which can be scaled or replaced independently from other components. Services are backed by containers. 
->> Par défaut, il y a 1 seul réseau pour toute l'application, nommé ''default'' +    * Contient donc des containers, qui sont définis par des arguments: 
->> Il faut détailler la config du réseau sous la directive top-level ''networks'' +      * Peut contenir une section ''build'' pour construire une image docker. 
->> à minima il faut donner un nom au réseau +      * ''image'' : spécifie l'image utilisée pour construire le container. [[https://github.com/opencontainers/.github/blob/main/docs/docs/introduction/digests.md|Format de l'adresse de l'image]] : ''[<registry>/][<project>/]<image>[:<tag>|@<digest>]'' 
->> Si un service est connectée à un réseau, il faut l'indiquer dans la définition du service par l'attribut ''networks''+      * ''container-name'' : définit le nom du container, pour éviter un nom aléatoire (pose de pb en cas de scaling -??-) 
 +      * ''links'' : définit les liens / networks pour être réliés à d'autres containers (?? version simplifiée des networks ??) 
 +      * ''ports'' : définit le mapping des ports entre l'hôte et les containers. Syntaxe (avec des ''" "''): ''"[HOST:]CONTAINER[/PROTOCOL]"'', avec  
 +        * HOST is [IP:](port | range) (optional). If it is not set, it binds to all network interfaces (0.0.0.0). 
 +        *  CONTAINER is port | range. 
 +        * PROTOCOL restricts ports to a specified protocol either tcp or udp(optional). Default is tcp. 
 +      * ''restart'' : définit la politique de (re)démarrage automatique : "no", always, unless-stopped, on-failure[:max-retries] 
 +      * ''secrets'' : pour définir des accès à des secrets comme des certificats, nécessite aussi une définition de secrets en top-level (comme volumes et networks) 
 + 
 +  * ''volumes'' : permet la configuration de named volumes pour l'application 
 +    * Pour utiliser un volume dans plusieurs services, il faut que chacun l'exprime explicitement dans l'attribut ''volume'' de ce service 
 +    * L'attribut ''external'' (true/false) indique que le volume existe déjà et est géré à l'extérieur du Compose file 
 + 
 +  * ''networks'' : permet aux services de communiquer entre eux. 
 +    Par défaut, il y a 1 seul réseau pour toute l'application, nommé ''default'' 
 +    Il faut détailler la config du réseau sous la directive top-level ''networks'' 
 +    à minima il faut donner un nom au réseau 
 +    Si un service est connectée à un réseau, il faut l'indiquer dans la définition du service par l'attribut ''networks''
  
 === Exemple === === Exemple ===
Ligne 61: Ligne 68:
         volumes:         volumes:
             - volume_name_1:/mount/path/inside/container             - volume_name_1:/mount/path/inside/container
 +        ports:
 +              - "3000"
 +              - "3000-3005"
 +              - "8000:8000"
 +              - "9090-9091:8080-8081"
 +              - "127.0.0.1:8001:8001"
 +              - "6060:6060/udp"    
 +
 +    nom_container_3:
 +        image: example/mon-image
 +        links:
 +            - nom_container_1
 +        restart: always 
  
 networks: networks:
Ligne 90: Ligne 110:
 # Executer les recettes du fichier dpcker-compose.yml du dossier actuel # Executer les recettes du fichier dpcker-compose.yml du dossier actuel
 # Créer et démarrer les containers # Créer et démarrer les containers
-docker compose up+docker compose up --detach 
 +# --detach pour lancer en arrière plan
  
 # Stop and remove containers, networks # Stop and remove containers, networks
Ligne 110: Ligne 131:
  
 De nombreuses commande de ''docker'' sont aussi présentes pour ''docker compose'', elles s'appliquent aux image/container/volume/network listés dans le Compose file (si j'ai bien compris). On listera : ''ls'', ''logs'', ''rm'', ''volumes'' etc. De nombreuses commande de ''docker'' sont aussi présentes pour ''docker compose'', elles s'appliquent aux image/container/volume/network listés dans le Compose file (si j'ai bien compris). On listera : ''ls'', ''logs'', ''rm'', ''volumes'' etc.
 +
 +===== Définir des variables d'environnement =====
 +
 +Parfois, certaines valeurs du docker compose file sont reprises à plusieurs endroits, et il fait sens de regrouper ces valeurs dans un fichier ''.venv''. Ainsi, la modification est centralisée. Il s'agit souvent de variables d'environnement qu'on souhaite passer au container (pas seulement au docker compose).
 +
 +=== Fichier .venv ===
 +
 +Le fichier ''.venv'' est placé dans le même dossier que le fichier de configuration ''compose.yml''.\
 +Le contenu du fichier est une liste de paramètres, format ini ou properties :
 +<code properties>
 +# Des lignes commentaires précédées d'un "#"
 +#
 +TAG=15-slim
 +OPENPROJECT_HTTPS=false
 +OPENPROJECT_HOST__NAME=localhost
 +PORT=127.0.0.1:8080
 +PGDATA="/var/lib/postgresql/data"
 +</code>
 +
 +L'utilisation dans le ''compose.yml'' se fait via des variables ''${PORT}'' dont le nom doit correspondre à celui dans le fichier ''.venv'' :
 +<code properties>
 +web:
 +  environment:
 +    - DEBUG=${DEBUG}
 +</code>
 +
 +Note: Dans la version docker CLI, on passe les variables avec l'argument ''-e DEBUG=1''
 +
 +=== Interpolation ===
 +L'interpolation permet de définir des variables et des comportements (par défaut, alternative, etc.) [https://docs.docker.com/compose/how-tos/environment-variables/variable-interpolation/#interpolation-syntax|source]: 
 +  * Direct substitution
 +    * ''${VAR}'' -> value of VAR
 +  * Default value
 +    * ''${VAR:-default}'' -> value of VAR if set and non-empty, otherwise default
 +    * ''${VAR-default}'' -> value of VAR if set, otherwise default
 +  * Required value
 +    * ''${VAR:?error}'' -> value of VAR if set and non-empty, otherwise exit with error
 +    * ''${VAR?error}'' -> value of VAR if set, otherwise exit with error
 +  * Alternative value
 +    * ''${VAR:+replacement}'' -> replacement if VAR is set and non-empty, otherwise empty
 +    * ''${VAR+replacement}'' -> replacement if VAR is set, otherwise empty
 +
docker_compose.1754153332.txt.gz · Dernière modification : de luc