Qu'est-ce que docker-compose ?
Compose est un outil (écrit essentiellement en Python) permettant de définir et d'exécuter des applications Docker multi-conteneurs. Avec Compose, vous utilisez un fichier YAML pour configurer les services de votre application. Ensuite, avec une seule commande, vous créez et démarrez tous les services à partir de votre configuration.
Compose fonctionne dans tous les environnements : production, staging, développement, test, ainsi que dans les flux de travail CI.
L'utilisation de Docker Compose est essentiellement un processus en trois étapes :
- Définissez l'environnement de votre application avec un
Dockerfilepour qu'elle puisse être reproduite partout. - Définissez les services qui composent votre application dans un fichier
docker-compose.yaml, afin qu'ils puissent être exécutés ensemble dans un environnement isolé. - Enfin, exécutez
docker-compose upetComposedémarrera et exécutera l'ensemble de votre application.
docker-compose up : Construit, (re)crée, démarre et attache les conteneurs d'un service. À moins qu'ils ne soient déjà en cours d'exécution, cette commande démarre également tous les services liés. La commande docker-compose up regroupe la sortie de chaque conteneur (essentiellement en exécutant docker-compose logs --follow). Lorsque la commande se termine, tous les conteneurs sont arrêtés.
L'exécution de la commande docker-compose up --detach démarre les conteneurs en arrière-plan et les laisse fonctionner.
Un fichier docker-compose.yml ressemble à ceci :
$ vi docker-compose.yml
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Compose dispose de commandes permettant de gérer l'ensemble du cycle de vie de votre application :
- Démarrer, arrêter et reconstruire les services ;
- Afficher l'état des services en cours d'exécution ;
- Stream de la sortie du journal des services en cours d'exécution ;
- Exécuter une commande ponctuelle sur un service.
Installer Docker Compose
Vous pouvez exécuter Compose sur macOS, Windows et Linux 64 bits. Docker Compose s'appuie sur Docker Engine pour tout travail significatif, alors assurez-vous que Docker Engine est installé localement ou à distance, selon votre configuration.
Sous Linux, vous pouvez télécharger le binaire Docker Compose depuis la page de publication du dépôt Compose sur GitHub. Suivez les instructions du lien, qui impliquent l'exécution de la commande curl dans votre terminal pour télécharger les binaires. Ces instructions étape par étape sont également incluses ci-dessous.
Exécutez cette commande pour télécharger la version stable actuelle de Docker Compose :
# Pour installer une autre version de Compose, remplacez 1.29.2 par la version de Compose que vous souhaitez utiliser. # La commande suivante installe l'exécutable "docker-compose" dans le répertoire "/usr/local/bin" $sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Appliquez les permissions d'exécution au binaire :
$ sudo chmod +x /usr/local/bin/docker-compose
Installez la complétion de commande pour les shells bash et zsh.
# Placez le script de complétion dans /etc/bash_completion.d/.
$ sudo curl \
-L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \
-o /etc/bash_completion.d/docker-compose
Pensez à rechargez votre terminal. Vous pouvez fermer puis ouvrir un nouveau terminal, ou recharger vos paramètres avec la commande source ~/.bashrc dans votre terminal actuel.
Vous pouvez maintenant tester votre installation :
$ docker-compose --version docker-compose version 1.29.2, build 5becea4c
Pour désinstaller Docker Compose, si vous avez utilisé curl, il suffit de faire :
$ sudo rm /usr/local/bin/docker-compose $ sudo rm /etc/bash_completion.d/docker-compose
Éléments du fichier docker-compose.yml
docker-compose permet de réaliser une application, conçue comme un ensemble de conteneurs qui doivent fonctionner ensemble avec des ressources partagées et des canaux de communication adéquats.
Les composants informatiques d'une application sont définis comme des services. Un service est un concept abstrait mis en œuvre sur des plateformes en exécutant une ou plusieurs fois la même image de conteneur (et la même configuration).
Les services communiquent entre eux par le biais de réseaux. Dans cette spécification, un réseau est une abstraction de capacité de plate-forme pour établir une route IP entre les conteneurs dans les services connectés ensemble. Les options de mise en réseau de bas niveau, spécifiques à la plate-forme, sont regroupées dans la définition du réseau et PEUVENT être partiellement mises en œuvre sur certaines plates-formes.
Voyons maintenant quelques-unes des options que l'on peut trouver dans un fichier docker-compose.yml (voir aussi documentation complète : https://github.com/compose-spec/compose-spec/blob/master/spec.md) :
services
Un service est une définition abstraite d'une ressource informatique (au sein d'une application), qui peut être modifiée ou remplacée indépendamment des autres composants. Les services s'appuient sur un ensemble de conteneurs, exécutés par la plate-forme en fonction des exigences de réplication et des contraintes de placement ; ils sont donc définis par une image Docker et un ensemble d'arguments d'exécution (runtime). Tous les conteneurs d'un service sont créés de manière identique avec ces arguments.
Un fichier Compose DOIT déclarer un élément racine services sous la forme d'une map dont les clés sont les noms de services, et les valeurs sont des définitions de services. Une définition de service contient la configuration qui est appliquée à chaque conteneur démarré pour ce service.
Chaque service PEUT également inclure une section Build, qui définit comment créer l'image Docker pour le service. Les implémentations Compose PEUVENT prendre en charge la construction d'images Docker à l'aide de cette définition de service. Si elle n'est pas implémentée, la section Build DOIT être ignorée et le fichier Compose DOIT toujours être considéré comme valide (la prise en charge de Build est un aspect FACULTATIF de la spécification Compose).
Chaque service définit les contraintes et les exigences d'exécution de ses conteneurs. La section deploy regroupe ces contraintes et permet à la plateforme d'ajuster la stratégie de déploiement pour faire correspondre au mieux les besoins des conteneurs aux ressources disponibles. La prise en charge de Deploy est un aspect OPTIONNEL de la spécification Compose. Si elle n'est pas implémentée, la section Deploy DOIT être ignorée et le fichier Compose DOIT toujours être considéré comme valide.
Voici un exemple de déclaration de services:
# Élément racine "services" (obligatoire)
services:
# Nom du premier service
# (ici "redis" : système de gestion de base de données clé-valeur extensible)
redis:
# Définition du service "redis"
# (ici, on indique l'image qui sera utilisée pour ce service,
# ainsi que des éléments de configuration de celui-ci)
image: "redis:alpine"
configs:
source: my_config
target: /redis_config
uid: "103"
gid: "103"
mode: 0440
# Nom du deuxième service
web:
# Définition du service "web"
# (ici, on indique où trouver le Dockerfile pour construire l'image
# et on indique que le service"web" doit être créé après le service "redis")
build: .docker/web_dir
depends_on:
- redis
build
La spécification Compose est étendue pour supporter une sous-section OPTIONNELLE de construction sur les services. Cette section définit les exigences de build pour l'image du conteneur de service. Lorsqu'une sous-section Build est présente pour un service, le fichier Compose peut ne pas avoir d'attribut Image pour le service correspondant, car l'implémentation Compose peut construire l'image à partir du Dockerfile spécifié dans la section Build (dans ce cas, l'image construite portera un nom automatiquement défini). Si les sous-sections build et image sont présentes toutes les deux pour le même service, Compose construit l'image à partir du fichier Dockerfile dont le chemin est indiqué dans build, et nomme cette image d'après le nom trouvé dans la sous-section image.
build spécifie les options de configuration qui sont appliquées au moment de la construction de l'image.
buildpeut être spécifié comme une chaîne contenant un chemin vers le contexte debuild(un Dockerfile canonique est alors recherché à la racine du contexte) ou uneurlvers un dépôtgit. Le chemin du contexte peut être absolu ou relatif, et dans ce cas, le chemin relatif DOIT être résolu à partir du dossier parent du fichierCompose. Comme un chemin absolu empêche le fichierComposed'être portable, l'implémentation deComposeDEVRAIT en avertir l'utilisateur.
version: "3.9"
services:
webapp:
# Un fichier "Dockerfile" doit être présent dans le le répertoire "dir", sous-répertoire relatif au dossier du fichier Compose
build: ./dir
buildpeut également être spécifié comme une définition détaillée de la construction. Dans ce cas, des arguments de construction peuvent être spécifiés, y compris un emplacement alternatif pour le fichierDockerfile. Celui-ci peut être un chemin absolu ou relatif. Si le chemin du fichierDockerest relatif, il DOIT être résolu à partir du chemin du contexte. Comme un chemin absolu empêche la portabilité du fichierCompose, la mise en œuvre deComposeDOIT avertir l'utilisateur si un chemin alternatif absolu du fichierDockerest utilisé.
Les arguments du build sont indiqués dans la sous-section args, ils peuvent ensuite être récupérés dans un fichier Dockerfile. Prenons l'exemple d'un fichier Dockerfile contenant les instructions suivantes :
ARG GIT_COMMIT RUN echo "Based on commit: $GIT_COMMIT"
Dans ce cas, la valeur de GIT_COMMIT peut être déclarée dans la sous-section args du fichier docker-compose.yml de la manière suivante :
version: "3.9"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
GIT_COMMIT: cdc3b19
- Si vous spécifiez
imageainsi quebuild, alorsComposenomme l'image construite avec la webapp et la balise optionnelle spécifiée dansimage:
# Il résulte du code ci-dessous une image nommée webapp et étiquetée tag, construite à partir de ./dir.
version: "3.9"
services:
webapp:
build: ./dir
image: webapp:tag
container_name
Spécifiez un nom de conteneur personnalisé, plutôt qu'un nom généré par défaut.
container_name: my-web-container
Comme les noms de conteneurs Docker doivent être uniques, vous ne pouvez pas faire évoluer un service au-delà d'un conteneur si vous avez spécifié un nom personnalisé. Si vous tentez de le faire, vous obtiendrez une erreur.
S'il est présent, le nom du conteneur DOIT suivre le format regex [a-zA-Z0-9][a-zA-Z0-9_.-]+.
restart
no est la politique de redémarrage par défaut, et elle ne redémarre un conteneur en aucune circonstance. Lorsque always est spécifié, le conteneur redémarre toujours. La stratégie on-failure redémarre un conteneur si le code de sortie indique une erreur on-failure. unless-stopped redémarre toujours un conteneur, sauf si le conteneur est arrêté (manuellement ou autrement).
restart: "no" restart: always restart: on-failure restart: unless-stopped
ports
Expose les ports du conteneur. Le mappage des ports NE DOIT PAS être utilisé avec network_mode : host, ce qui entraînerait une erreur d'exécution.
Syntaxe courte
La syntaxe courte est une chaîne séparée par des virgules pour définir l'IP de l'hôte, le port de l'hôte et le port du conteneur sous la forme suivante :
[HÔTE :]CONTAINER[/PROTOCOL]
HOSTest de la forme[IP :](port | plage)CONTAINERest de la formeport | plage- PROTOCOL permet de restreindre le port au protocole spécifié. Les valeurs
tcpetudpsont définies par la spécification, les implémentationsComposePEUVENT offrir une prise en charge des noms de protocole spécifiques à la plate-forme.
L'IP de l'hôte, si elle n'est pas définie, DOIT être liée à toutes les interfaces réseau (la valeur de l'IP par défaut, si non définie, est 0.0.0.0, ce qui signifie toutes les interfaces). Le port peut être une valeur unique ou une plage. L'hôte et le conteneur DOIVENT utiliser des plages équivalentes.
Vous pouvez spécifier les deux ports (HÔTE:CONTENEUR) ou seulement le port du conteneur. Dans ce dernier cas, l'implémentation Compose DEVRAIT allouer automatiquement tout port hôte non attribué.
HOST:CONTAINER DOIT toujours être spécifié sous la forme d'une chaîne de caractères (entre guillemets), afin d'éviter les conflits avec le flottant yaml base-60.
Note : Lorsque vous mappez des ports au format HOST:CONTAINER, vous pouvez obtenir des résultats erronés si vous utilisez un port de conteneur inférieur à 60, car YAML analyse les nombres au format xx:yy comme une valeur en base 60. Pour cette raison, nous vous recommandons de toujours spécifier explicitement vos mappages de ports sous forme de chaînes de caractères (avec des guillemets).
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "127.0.0.1::5000
- "6060:6060/udp"
- "12400-12500:1240"
Syntaxe longue
La syntaxe longue permet de configurer des champs supplémentaires qui ne peuvent pas être exprimés dans la forme courte.
target: le port du conteneurpublished: le port exposé publiquementhost_ip: le mappage de l'IP de l'hôte, non spécifié signifie toutes les interfaces réseau (0.0.0.0)protocol: le protocole du port (tcpouudp), non spécifié signifie tout protocole.mode:hostpour publier un port d'hôte sur chaque noeud, ouingresspour un port à équilibrer en charge.
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
volumes
volumes permet de monter des chemins d'accès aux hôtes ou des volumes nommés, qui DOIVENT être accessibles par les conteneurs de services.
Si le montage est un chemin sur un hôte et qu'il n'est utilisé que par un seul service, il PEUT être déclaré comme faisant partie de la définition du service au lieu de la clé de volumes de premier niveau.
Pour réutiliser un volume dans plusieurs services, un volume nommé DOIT être déclaré dans la clé de volumes de premier niveau.
La syntaxe courte utilise le format générique [SOURCE :]TARGET[:MODE], où SOURCE peut être un chemin d'accès à l'hôte ou un nom de volume. TARGET est le chemin du conteneur où le volume est monté. Les modes standard sont ro pour "lecture seule" et rw pour "lecture-écriture" (par défaut).
Vous pouvez monter un chemin relatif sur l'hôte, qui se développe relativement au répertoire du fichier de configuration Compose utilisé. Les chemins relatifs doivent toujours commencer par . ou ...
volumes: # Spécifier juste un chemin et laisser le moteur créer un volume. - /var/lib/mysql # Spécifier un mappage de chemin absolu - /opt/data:/var/lib/mysql # Chemin sur l'hôte, relatif au fichier Compose - ./cache:/tmp/cache # Chemin relatif à l'utilisateur - ~/configs:/etc/configs/:ro # Volume nommé - datavolume:/var/lib/mysql
La syntaxe de la forme longue (ajoutée dans le format de fichier de la version 3.2) permet de configurer des champs supplémentaires qui ne peuvent pas être exprimés dans la forme courte :
-
type: le type de montagevolume,bind,tmpfsounpipe -
source: la source du montage, un chemin sur l'hôte pour un montagebind, ou le nom d'un volume défini dans la clé des volumes de premier niveau. Non applicable pour un montagetmpfs. -
target: le chemin dans le conteneur où le volume est monté. -
read_only: flag pour définir le volume comme étant en lecture seule -
bind: configure des options de liaison supplémentairespropagation: le mode de propagation utilisé pour la liaison
-
volume: configure des options de volume supplémentairesnocopy: flag pour désactiver la copie des données d'un conteneur lorsqu'un volume est créé
-
tmpfs: configure des options tmpfs supplémentairessize: la taille pour le montage tmpfs en octets
version: "3.9"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
# volume nommé "mydata"
- type: volume
source: mydata
target: /data
volume:
nocopy: true
# bind mount (répertoire "./static" sur l'hôte)
- type: bind
source: ./static
target: /opt/app/static
networks:
webnet:
# 'mydata' est également déclaré dans la clé des volumes de premier niveau,
# ainsi le volume peut être utilisé par d'autres services
volumes:
mydata:
volumes_from
volumes_from monte tous les volumes d'un autre service ou conteneur, en spécifiant éventuellement un accès en lecture seule (ro) ou en lecture-écriture (rw). Si aucun niveau d'accès n'est spécifié, l'accès en lecture-écriture DOIT être utilisé.
La valeur de la chaîne définit un autre service du modèle d'application Compose à partir duquel monter des volumes. Le préfixe container :, s'il est pris en charge, permet de monter des volumes à partir d'un conteneur qui n'est pas géré par l'implémentation Compose.
volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw
volumes (clé de premier niveau)
La section volumes permet de configurer des volumes nommés qui peuvent être réutilisés par plusieurs services. Voici un exemple d'une configuration à deux services où le répertoire de données d'une base de données est partagé avec un autre service en tant que volume afin qu'il puisse être sauvegardé périodiquement :
services:
backend:
image: awesome/database
volumes:
- db-data:/etc/data
backup:
image: backup-service
volumes:
- db-data:/var/lib/backup/data
volumes:
db-data:
Une entrée sous la clé volumes de premier niveau peut être vide, auquel cas elle utilise la configuration par défaut de la plate-forme pour créer un volume. En option, vous pouvez la configurer avec les clés suivantes : driver, driver_opts, external, labels, name.
image
Spécifiez l'image à partir de laquelle démarrer le conteneur. Il peut s'agir d'un repository/tag ou d'un ID d'image partiel.
image: redis image: ubuntu:18.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
Si l'image n'existe pas, Compose tente de la récupérer, à moins que vous n'ayez également spécifié build, auquel cas il la construit en utilisant les options spécifiées et la marque avec la balise spécifiée.
environment
environment définit les variables d'environnement définies dans le conteneur. environment peut être déclaré via un tableau ou une map. Toute valeur booléenne (true, false, yes, no) DOIT être placée entre guillemets pour éviter qu'elle ne soit convertie en True ou False par l'analyseur YAML.
Les variables d'environnement PEUVENT être déclarées par une seule clé (sans valeur au signe égal). Dans ce cas, les implémentations Compose DEVRAIENT compter sur une interaction de l'utilisateur pour résoudre la valeur. Si elles ne le font pas, la variable est désactivée et sera supprimée de l'environnement du conteneur.
- Syntaxe
map:
environment : RACK_ENV : development SHOW : "true" USER_INPUT :
- Syntaxe
tableau:
environment : - RACK_ENV=development - SHOW=true - USER_INPUT
Lorsque env_file et environment sont tous deux définis pour un service, les valeurs définies par environment ont la priorité.
depends_on
depends_on exprime les dépendances de démarrage et d'arrêt entre les services.
Syntaxe courte
La variante de syntaxe courte spécifie uniquement les noms de service des dépendances. Les dépendances de services entraînent les comportements suivants :
- Les implémentations
ComposeDOIVENT créer les services dans l'ordre des dépendances. Dans l'exemple suivant,dbetredissont créés avantweb. - Les implémentations
ComposeDOIVENT supprimer les services dans l'ordre des dépendances. Dans l'exemple suivant,webest supprimé avantdbetredis.
Exemple simple :
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
- Les implémentations de
ComposeDOIVENT garantir que les services de dépendance ont été démarrés avant de démarrer un service dépendant. - Les implémentations
ComposePEUVENT attendre que les services de dépendance soient "prêts" avant de démarrer un service dépendant.
Syntaxe longue
La syntaxe longue permet de configurer des champs supplémentaires qui ne peuvent pas être exprimés dans la forme courte.
condition: condition sous laquelle la dépendance est considérée comme satisfaiteservice_started: est un équivalent de la syntaxe courte décrite ci-dessusservice_healthy: spécifie qu'une dépendance doit être "saine" (comme indiqué parhealthcheck) avant de démarrer un service dépendant.service_completed_successfully: spécifie qu'une dépendance doit être exécutée avec succès avant de démarrer un service dépendant.
Les dépendances de services entraînent les comportements suivants :
- Les implémentations
ComposeDOIVENT créer les services dans l'ordre des dépendances. Dans l'exemple suivant,dbetredissont créés avantweb. - Les implémentations
ComposeDOIVENT attendre que leshealthcheckssoient passés sur les dépendances marquées avecservice_healthy. Dans l'exemple suivant,dbest censé être "sain" avant quewebne soit créé. - Les implémentations
ComposeDOIVENT supprimer les services dans l'ordre des dépendances. Dans l'exemple suivant,webest supprimé avantdbetredis.
Exemple simple :
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
- Les implémentations
ComposeDOIVENT garantir que les services de dépendance ont été démarrés avant de démarrer un service dépendant. - Les implémentations de
ComposeDOIVENT garantir que les services de dépendance marqués avecservice_healthysont "sains" avant de démarrer un service dépendant.
links
links définit un lien réseau vers les conteneurs d'un autre service. Il faut soit spécifier à la fois le nom du service et un alias de lien (SERVICE:ALIAS), soit seulement le nom du service.
web :
links :
- db
- db:database
- redis
Les conteneurs pour le service lié DOIVENT être accessibles à un nom d'hôte identique à l'alias, ou au nom du service si aucun alias n'a été spécifié.
Les liens ne sont pas nécessaires pour permettre aux services de communiquer - lorsqu'aucune configuration réseau spécifique n'est définie, tout service DOIT être capable d'atteindre tout autre service à son nom sur le réseau par défaut. Si les services déclarent les réseaux auxquels ils sont rattachés, les liens NE DOIVENT PAS remplacer la configuration du réseau et les services qui ne sont pas rattachés à un réseau partagé NE DOIVENT PAS être en mesure de communiquer. Les implémentations de Compose PEUVENT NE PAS avertir l'utilisateur de ce décalage de configuration.
Les liens expriment également une dépendance implicite entre les services de la même manière que depends_on, ils déterminent donc l'ordre de démarrage des services.
networks
networks définit les réseaux auxquels les conteneurs de services sont rattachés, en faisant référence aux entrées de la clé de premier niveau networks.
services:
some-service:
networks:
- some-network
- other-network
aliases
aliases déclare des noms d'hôtes alternatifs pour ce service sur le réseau. D'autres conteneurs sur le même réseau peuvent utiliser soit le nom du service, soit cet alias pour se connecter à l'un des conteneurs du service.
Puisque les alias sont adaptés au réseau, le même service peut avoir différents alias sur différents réseaux.
Remarque : Un alias à l'échelle du réseau peut être partagé par plusieurs conteneurs, et même par plusieurs services. Si c'est le cas, il n'est pas garanti de savoir exactement à quel conteneur le nom se résout.
Le format général est présenté ici :
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
Dans l'exemple ci-dessous, le service frontend pourra atteindre le service backend au nom d'hôte backend ou database sur le réseau back-tier, et le service monitoring pourra atteindre le même service backend à db ou mysql sur le réseau admin.
services:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier
monitoring:
image: awesome/monitoring
networks:
- admin
backend:
image: awesome/backend
networks:
back-tier:
aliases:
- database
admin:
aliases:
- mysql
networks:
front-tier:
back-tier:
admin:
networks (clé de premier niveau)
Les networks sont la couche qui permet aux services de communiquer entre eux. Le modèle de réseau exposé à un service est limité à une simple connexion IP avec les services cibles et les ressources externes, tandis que la définition du réseau permet d'affiner l'implémentation réelle fournie par la plate-forme.
Les réseaux peuvent être créés en spécifiant le nom du réseau dans une section de réseaux de premier niveau. Les services peuvent se connecter aux réseaux en spécifiant le nom du réseau dans la sous-section des réseaux de services.
Dans l'exemple suivant, au moment de l'exécution, les réseaux front-tier et back-tier seront créés et le service frontend sera connecté au réseau front-tier et au réseau back-tier.
services:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier
networks:
front-tier:
back-tier:
driver
driver indique quel pilote doit être utilisé pour ce réseau. Les implémentations Compose DOIVENT renvoyer une erreur si le pilote n'est pas disponible sur la plate-forme.
driver: overlay
Les valeurs par défaut et disponibles sont spécifiques à la plate-forme. La spécification Compose DOIT prendre en charge les pilotes spécifiques suivants : none et host
hostutilise la pile réseau de l'hôtenonedésactive la mise en réseau
La syntaxe d'utilisation des réseaux intégrés tels que host et none est différente, car ces réseaux existent implicitement en dehors de la portée de l'implémentation Compose. Pour les utiliser, on DOIT définir un réseau externe avec le nom host ou none et un alias que l'implémentation Compose peut utiliser (hostnet ou nonet dans les exemples suivants), puis accorder au service l'accès à ce réseau en utilisant son alias.
services:
web:
networks:
hostnet: {}
networks:
hostnet:
external: true
name: host
services:
web:
...
networks:
nonet: {}
networks:
nonet:
external: true
name: none
La spécification Compose fournit également par défaut les drivers bridge et overlay :
bridge: Le pilote réseau par défaut. Si vous ne spécifiez pas de pilote, il s'agit du type de réseau que vous créez. Les réseauxbridgesont généralement utilisés lorsque vos applications s'exécutent dans des conteneurs autonomes qui doivent communiquer.overlay: Les réseaux superposés connectent plusieursdémons Dockerensemble et permettent aux services de l'essaim (swarm services) de communiquer entre eux. Vous pouvez également utiliser les réseaux superposés pour faciliter la communication entre un service d'essaimage et un conteneur autonome, ou entre deux conteneurs autonomes sur différentsdémons Docker. Cette stratégie supprime la nécessité d'effectuer un routage au niveau du système d'exploitation entre ces conteneurs.host: pour les conteneurs autonomes, supprimez l'isolation réseau entre le conteneur et l'hôte Docker, et utilisez directement le réseau de l'hôte.none: Pour ce conteneur, désactivez tous les réseaux. Généralement utilisé en conjonction avec un pilote réseau personnalisé.nonen'est pas disponible pour lesservices swarm.
networks:
my-network:
driver: bridge
user
user remplace l'utilisateur utilisé pour exécuter le processus du conteneur. La valeur par défaut est celle définie par l'image (c'est-à-dire Dockerfile USER), si elle n'est pas définie, c'est root.
Quelques commandes utiles
docker-compose up: démarre les services décrits dans mondocker-compose.ymlet ne me rend pas la main.docker-compose up -d: fait la même chose mais me rend la main une fois que les services sont démarrés (-d:detached mode).docker-compose stop: permet de stopper l'ensemble des services en cours d'exécution (utile lorsquecomposea été lancé en mode détaché, comme indiqué ci-dessus).docker-compose ps: liste les conteneurs en cours d'exécution.
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------
composetest_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
composetest_web_1 flask run Up 0.0.0.0:5000->5000/tcp,:::5000->5000/tcp
docker-compose up --build: reconstruit les images avant de lancer les conteneurs.docker-compose down: stoppe les services et supprime les ressources.docker-compose restart: redémarre l’ensemble des services.docker-compose restart nginx: redémarre un des services (icinginx).docker-compose exec rails bash: me fournit uneconsole bashau sein du conteneurrails(execexécute une commande dans un conteneur en cours d'exécution).docker-compose exec rails bin/rails db:migrate: effectue unrails db:migrateau sein du conteneurrails.docker-compose exec redis env: exécute la commandeenvsur le serviceredisen cours d'exécution
$ docker-compose exec redis env REDIS_VERSION=6.2.5 REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.5.tar.gz REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae
- docker-compose run redis env : permet d'exécuter la commande
envsur le service redisalors que celui-ci est arrêté.
$ docker-compose run redis env Creating network "composetest_default" with the default driver Creating composetest_redis_run ... done REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.5.tar.gz REDIS_VERSION=6.2.5
docker-compose logs: me retourne l’ensemble des logs des services depuis le dernier démarrage et me rend la main.docker-compose logs -f: affiche les logs des services et continue à les « écouter » sans me rendre la main.docker-compose logs -f rails: fait la même chose pour le conteneurrailsuniquement.