J’aimerais partager avec vous certaines de mes stack Docker. En effet, je galère pour en faire fonctionner certaines, ou alors pour trouver les bonnes composantes de celle-ci.
Découvrez premièrement stack Docker dédiée à la gestion, l’analyse et l’extraction de données à grande échelle, avec des outils puissants comme PostgreSQL, Jupyter, et Selenium.
Vue d’ensemble de la stack
Cette stack Docker a été conçue pour offrir une infrastructure polyvalente et automatisée, permettant de gérer, transformer, analyser et visualiser les données. Chaque service joue un rôle clé dans le flux de travail de la science des données, en automatisant des tâches répétitives et en facilitant l’analyse des données de manière simple et efficace.
Description des services
1. PostgreSQL et pgAdmin : Le stockage et la gestion des bases de données
- PostgreSQL est le moteur de base de données utilisé pour stocker toutes les données structurées. Il gère de manière robuste les jeux de données volumineux et offre une grande flexibilité pour les requêtes complexes. Il est configuré via des variables d’environnement pour adapter le nom d’utilisateur, le mot de passe, et la base de données en fonction des besoins.
- pgAdmin fournit une interface graphique pour gérer PostgreSQL de manière plus conviviale. Il est accessible via le port 5050 et permet d’explorer les bases de données, d’exécuter des requêtes et d’administrer la base sans avoir recours à la ligne de commande.
2. MinIO : Le stockage objet à la manière d’Amazon S3
MinIO est une solution de stockage d’objets compatible avec l’API Amazon S3, idéale pour stocker des fichiers volumineux ou des jeux de données. Ainsi, cette stack, il permet de stocker des fichiers qui seront ensuite traités ou analysés par les autres services. MinIO est accessible via les ports 9000 pour l’API S3 et 9001 pour l’interface de gestion.
3. Apache NiFi : Automatisation et ingestion de données
Apache NiFi est un outil opensource pour l’ingestion et la transformation des flux de données. Il permet de connecter différentes sources et destinations de données, tout en appliquant des transformations au passage. Il est utile pour automatiser l’importation de fichiers depuis MinIO vers PostgreSQL, par exemple. L’interface est accessible via le port 8080, et elle permet de configurer des workflows complexes via une interface visuelle.
Attention, c’est le seul composant de la stack pour lequel, à date, j’ai de gros doutes quant à son rapport efficacité/apprentissage.
4. Jupyter Notebook : Analyse interactive des données
Jupyter Notebook est l’outil parfait pour les analyses interactives. Il permet d’exécuter du code Python en temps réel, d’explorer des données, et de visualiser les résultats directement dans un navigateur. Accessible via le port 9012, Jupyter permet de traiter les données stockées dans PostgreSQL ou MinIO et d’effectuer des analyses avancées. Les notebooks sont stockés localement, garantissant la persistance des travaux.
5. Metabase : Visualisation et reporting des données
Metabase est un outil de visualisation de données connecté à PostgreSQL, permettant de créer des dashboards et des rapports interactifs. Simple à utiliser, il permet de poser des questions sur les données sans avoir besoin d’écrire du code. Accessible via le port 3033, Metabase permet de générer rapidement des insights visuels à partir des données stockées dans PostgreSQL.
Pour le moment, soyons honnête, je n’ai fait que modifier un dashboard template, mais assez rapidement je vais m’atteler à un dashbord basé sur les données de data.gouv.fr.

6. Selenium Grid Hub et Node Firefox : Extraction automatisée de données (web scraping)
Selenium est ici utilisé pour extraire des données (web scraping) depuis certains sites internet. Selenium Grid permet de gérer plusieurs navigateurs pour l’extraction de données automatisée, tandis que Selenium Node Firefox exécute les scripts de scraping. Selenium est configuré avec un hub (port 4444) pour centraliser les commandes et un nœud Firefox pour simuler un navigateur réel.
Cela permet de récupérer des informations à partir de sites web de manière automatisée, en optimisant les performances grâce à l’architecture distribuée. Je le détourne un peu de sa fonction première, mais il a tellement d’utilités, comme effectuer des tests de sécurité sur les pages accessibles via des liens de spam. En automatisant des scénarios de test, on peut vérifier si les pages contiennent des contenus malveillants.
Conclusion
Cette stack Docker offre une solution complète pour la gestion des données, du stockage à l’analyse, en passant par l’extraction et la visualisation. Chaque service, qu’il s’agisse de PostgreSQL pour le stockage, de Jupyter Notebook pour l’analyse, ou de Selenium pour l’extraction de données, joue un rôle crucial dans la chaîne de traitement. Que vous soyez data scientist, analyste ou ingénieur, cette infrastructure vous permettra dans un premier temps de vous familiariser avec le monde de la Data. Ensuite c’est un bon point de départ pour automatiser vos flux de travail et obtenir des résultats rapidement, le tout dans un environnement intégré et flexible.
services:
postgres:
image: postgres:13
container_name: Datascientist_PG
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
ports:
- "5433:5432"
volumes:
- /shared_volumes/docker/datascientist/postgres_data:/var/lib/postgresql/data
# Ajout de pgAdmin
pgadmin:
image: dpage/pgadmin4
container_name: Datascientist_PGAdmin
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL} # L'adresse e-mail utilisée pour se connecter à pgAdmin
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD} # Le mot de passe pour se connecter à pgAdmin
ports:
- "5050:80" # Port pour accéder à pgAdmin via le navigateur
volumes:
- /shared_volumes/docker/datascientist/pgadmin_data:/var/lib/pgadmin
- /shared_volumes/docker/datascientist/pgadmin_data/config_local.py:/pgadmin4/config_local.py
depends_on:
- postgres
minio:
#image: minio/minio
image: quay.io/minio/minio
container_name: Datascientist_S3
#command: server /data
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
ports:
- 9000:9000
- 9001:9001
volumes:
- /shared_volumes/docker/datascientist/minio_data:/data
nifi:
image: apache/nifi:latest
container_name: Datascientist_NiFi
ports:
- ${NIFI_PORT}:8080
volumes:
- /shared_volumes/docker/datascientist/nifi_data:/opt/nifi/nifi-current/data
environment:
NIFI_WEB_HTTP_PORT: 8080
NIFI_HOME: /opt/nifi/nifi-current
command: sh -c "/opt/nifi/nifi-current/bin/nifi.sh start && tail -f /opt/nifi/nifi-current/logs/nifi-app.log"
jupyter:
image: jupyter/base-notebook:latest # Utilisation de l'image de base Jupyter Notebook
container_name: Datascientist_Jupyter
ports:
- "9012:8888" # Expose le port 8888 pour accéder à Jupyter
volumes:
- /shared_volumes/docker/datascientist/jupyter_notebooks:/home/jovyan/work # Monte un répertoire local pour les notebooks
environment:
JUPYTER_ENABLE_LAB: "no" # Désactiver JupyterLab pour utiliser uniquement Jupyter Notebook
GRANT_SUDO: "yes" # Accorder les droits sudo à l'utilisateur jovyan
NB_UID: 1000 # Optionnel: configurer l'UID de l'utilisateur jovyan
NB_GID: 100 # Optionnel: configurer le GID de l'utilisateur jovyan
command: start-notebook.sh --NotebookApp.token='' --NotebookApp.password='' # Désactive le token d'authentification pour l'accès
# Ajout de Metabase
metabase:
image: metabase/metabase:latest
container_name: Datascientist_Metabase
environment:
MB_DB_TYPE: postgres
MB_DB_DBNAME: ${POSTGRES_DB}
MB_DB_PORT: 5432
MB_DB_USER: ${POSTGRES_USER}
MB_DB_PASS: ${POSTGRES_PASSWORD}
MB_DB_HOST: postgres
ports:
- 3033:3000 # Port pour accéder à Metabase
depends_on:
- postgres
volumes:
- /shared_volumes/docker/datascientist/metabase_data:/metabase-data
# Selenium Grid Hub
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- "4444:4444" # Port pour accéder au hub Selenium
environment:
SE_EVENT_BUS_PUBLISH_PORT: 4442
SE_EVENT_BUS_SUBSCRIBE_PORT: 4443
# Selenium Node Firefox
selenium-node-firefox:
image: selenium/node-firefox:latest
container_name: selenium-node-firefox
environment:
- SE_EVENT_BUS_HOST=selenium-hub # L'adresse du hub
- SE_EVENT_BUS_PUBLISH_PORT=4442 # Port pour publier les événements
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443 # Port pour souscrire aux événements
- SE_NODE_MAX_SESSIONS=1 # Limite des sessions simultanées
depends_on:
- selenium-hub
volumes:
- /dev/shm:/dev/shm # Optimisation pour réduire les problèmes de performance
Un commentaire
Pingback: Docker, K3s, K8s, pourquoi et quand choisir l’un ou l’autre?