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

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.

TIG Stack

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 et frontend)
  • 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.