docker-compose existe pour vous éviter d'avoir à écrire une tonne de commandes avec docker-cli.
docker-compose permet également de démarrer facilement plusieurs conteneurs en même temps et de les connecter automatiquement avec une certaine forme de mise en réseau.
Le but de docker-compose est de fonctionner comme docker cli mais d'émettre plusieurs commandes beaucoup plus rapidement.
Pour utiliser docker-compose, vous devez encoder les commandes que vous exécutiez auparavant dans un docker-compose.yml
fichier.
Vous n'allez pas simplement les copier coller dans le fichier yaml, il y a une syntaxe spéciale.
Une fois créé, vous devez le nourrir à la cli docker-compose et ce sera à la cli d'analyser le fichier et de créer tous les différents conteneurs avec la configuration correcte que nous spécifions.
Vous aurez donc des conteneurs séparés, disons par exemple, un est redis-server
et le second est node-app
et vous voulez que créé à l'aide de Dockerfile
dans votre répertoire actuel.
De plus, après avoir créé ce conteneur, vous devez mapper un port du conteneur à la machine locale pour accéder à tout ce qui s'y trouve.
Donc, pour votre docker-compose.yml
fichier, vous voudriez commencer la première ligne comme ceci:
version: '3'
Cela indique à Docker la version que docker-compose
vous souhaitez utiliser. Après cela, vous devez ajouter:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
Veuillez noter l'indentation, très importante. Aussi, remarquez pour un service que je saisis une image, mais pour un autre service que je disdocker-compose
de regarder à l'intérieur du répertoire courant pour construire l'image qui sera utilisée pour le deuxième conteneur.
Ensuite, vous souhaitez spécifier tous les différents ports que vous souhaitez ouvrir sur ce conteneur.
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
Veuillez noter le tiret, un tiret dans un fichier yaml est la façon dont nous spécifions un tableau. Dans cet exemple, je mappe 8081
sur ma machine locale 8081
sur le conteneur comme ceci:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
Ainsi, le premier port est votre machine locale, et l'autre est le port sur le conteneur, vous pouvez également faire la distinction entre les deux pour éviter toute confusion comme ceci:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
En développant votre docker-compose.yml
fichier comme celui-ci, il créera ces conteneurs sur essentiellement le même réseau et ils auront un accès gratuit pour communiquer entre eux comme bon leur semble et échanger autant d'informations qu'ils le souhaitent.
Lorsque les deux conteneurs sont créés à l'aide de docker-compose
nous n'avons besoin d'aucune déclaration de port.
Maintenant, dans mon exemple, nous devons faire une configuration de code dans l'application Nodejs qui ressemble à ceci:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
J'utilise cet exemple ci-dessus pour vous faire savoir qu'il peut y avoir une configuration spécifique que vous auriez à faire en plus du docker-compose.yml
fichier qui peut être spécifique à votre projet.
Maintenant, si vous vous retrouvez à travailler avec une application Nodejs et redis, vous voulez vous assurer que vous êtes au courant du port par défaut que Nodejs utilise, donc j'ajouterai ceci:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
Docker va donc voir que l'application Node recherche redis-server
et redirige cette connexion vers ce conteneur en cours d'exécution.
Tout le temps, le Dockerfile
seul contient ceci:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Donc, alors qu'avant, vous devriez exécuter docker run myimage
pour créer une instance de tous les conteneurs ou services à l'intérieur du fichier, vous pouvez exécuter à la place, docker-compose up
et vous n'avez pas besoin de spécifier une image car Docker recherchera dans le répertoire de travail actuel et recherchera un docker-compose.yml
déposer à l'intérieur de là.
Avant docker-compose.yml
, nous devions traiter deux commandes distinctes de docker build .
et docker run myimage
, mais dans le docker-compose
monde si vous voulez reconstruire vos images, vous écrivez docker-compose up --build
. Cela indique à Docker de redémarrer les conteneurs mais de le reconstruire pour obtenir les dernières modifications.
Il docker-compose
est donc plus facile de travailler avec plusieurs conteneurs. La prochaine fois que vous devez démarrer ce groupe de conteneurs en arrière-plan, vous pouvez le faire docker-compose up -d
et les arrêter, vous pouvez le faire docker-compose down
.