docker compose est un outil facilitant l’utilisant des containers et leur orchestration.
L’avantage de docker compose est de rassembler la configuration du ou des containers dans un fichier (docker-compose.yaml)
Dans ce fichier, on va retrouver :
- Le nom de chaque container
- L’image utilisée
- Le ou les volumes à monter
- Le mappage des ports réseaux
- Automatiquement, tous les containers partagent le même réseau
- Pour lancer les containers, une seule commande
docker compose up
Exemple avec le projet docker-mqtt
Ce projet basique vous propose de créer et d’utiliser un broker MQTT Moquitto dans un container.
Vous trouverez sur le projet les utilisations possibles dans le wiki du projet
Le projet est composé de 4 branches pour progressivement découvrir 4 cas d’utilisations.
- branche
sans-tls
: Une utilisation simple du broker sur le PC de développement - branche
avec-tls
: Toujours sur le PC de développement, mais en intégrant un certificat TLS - branche
mosquitto-ip-host
. Sans TLS, mais le broker est accessible depuis un autre PC du réseau. - branche
avec-tls-et-port
. Enfin, le broker est disponible depuis un PC du réseau et les certificats sont opérationnels.
Quelques explications du fichier docker-compose.yaml
services:
mosquitto:
image: eclipse-mosquitto:2
network_mode: "host"
volumes:
# - ./config/:/mosquitto/config/:ro
- ./config/:/mosquitto/config/
- ./log/:/mosquitto/log/
- data:/mosquitto/data/
- ./certs/:/mosquitto/certs/
ports:
# - 1883:1883
- 8883:8883
- 9001:9001
volumes:
data: ~
network_mode: "host"
: Permet d’utiliser le réseau de l’hôte (la machine de développement) pour un accès public.
volumes:
- ./config/:/mosquitto/config/
Le répertoire ./config
local sera mappé avec le répertoire /mosquitto/config
du container
Ce répertoire contient la configuration de notre broker
ports:
- 8883:8883
Le port d’écoute du container et du PC local, avec une redirection éventuelle (Ici non, nous conservons le port par défaut de Mosquitto en TLS)
volumes:
data: ~
Ce répertoire data
contient les données du broker (volume mappé)
Utilisation de docker compose
- Lancer le/les containers
docker compose up
- Lancer le/containers en mode détaché (récupérer le prompt)
docker compose up -d
- Vérifier que les containers sont lancés
docker compose ps
- Vérifier l’état (run/exited) de tous les containers
docker compose ps -a
- Afficher les logs
docker compose logs -f
- Arrêter le/les containers
docker compose down
Un exemple avec plusieurs containers
TIG
TIG (Telegraf, InfluxDB, Grafana) est une solution souvent utilisée pour monitorer des données temporelles. On peut trouver plusieurs exemples de codes à adapter sur des dépôts public, comme celui proposé ci-après.
Le docker compose.yml de ce projet se présente ainsi
version: "3"
services:
influxdb:
build: ./influxdb
container_name: ${CONTAINER_PREFIX}_influxdb
ports:
- ${INFLUXDB_PORT}:${INFLUXDB_PORT}
volumes:
- /var/lib/influxdb:/var/lib/influxdb
restart: always
env_file:
- .env
networks:
- backend
- frontend
telegraf:
build: ./telegraf
container_name: ${CONTAINER_PREFIX}_telegraf
links:
- influxdb
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc:/hostfs/proc
privileged: true
restart: always
env_file:
- .env
networks:
- backend
grafana:
build: ./grafana
container_name: ${CONTAINER_PREFIX}_grafana
ports:
- ${GRAFANA_PORT}:${GRAFANA_PORT}
links:
- influxdb
volumes:
- /var/lib/grafana
- /var/log/grafana
- /var/lib/grafana/plugins
restart: always
env_file:
- .env
networks:
- frontend
networks:
backend:
frontend:
On retrouve dans ce code les éléments du premier exemple.
Les différences sont les suivantes :
- Plusieurs containers sont exécutés. (influxdb, telegraf et grafana)
- un fichier
.env
est utilisé pour stocker les variables - le
restart always
permet de redémarrer le container avec le PC hôte (attention…) - Deux network sont définis (
backend
etfrontend
) - Les containers dépendent les uns des autres (
link
)
Conclusion
L’utilisation du projet se fait avec les mêmes commandes que pour le premier exemple, docker compose
Ceci conclut le tour d’horizon des possibilités de travail avec des containers, pour une utilisation basique. C’est un sujet qui évolue très rapidement et qui donc nécessite de se former continuellement pour utiliser les outils adéquats.
Bien prêter une attention à l’objectif avant de se lancer et connaître les commandes basiques pour maîtriser l’état de votre système.