Tuto : monter un environnement de dev Docker avec Traefik et OAuth2 prêt pour le micro-service

Frederic Leaux
6 min readMay 9, 2023

--

Un environnement de dev Docker avec Traefik

Notre objectif est de pouvoir monter un nouvel environnement de dev sur une machine vierge en moins de deux heures. L’idée c’est d’avoir le moins de dépendances possibles sur le poste de travail et le reste c’est des conteneurs Docker versionnés sur Git.

Nous allons créer un container Docker principal, que nous allons nommer “Dockerized” qui comprendra les services utilisés par les autres containers.

Nous allons créer deux applications, une Symfony et une en Python qui utiliseront Traefik, MariaDb et Redis du container Dockerized.

Nous verrons dans un autre tuto, qui suivra rapidement, comment utiliser Keycloack pour faire de l’OAuth2 et sécuriser les échanges entre les services (API).

Pre-requis

Nous n’avons que trois dépendances à installer :

Une fois cette petite liste d’installations terminée, vous n’aurez plus besoin d’installer quoi que ce soit de plus pour travailler. Le reste sera géré par Docker.

Le conteneur principal : Dockerized

Pour ne écrire chaque ligne de code ici, j’ai créé un projet Git qui servira de base au tuto et je vais détailler ci-après.

Je vous invite à le télécharger ou le cloner en cliquant ici.

Y a quoi la dedans ?

Ce qui est utilisé par l’ensemble de mes projets :

  • Maildev (un serveur de messagerie électronique local open-source. C’est un serveur local SMTP qui va intercepter tous les emails. Il propose en plus une interface web qui permettra de voir les mails capturés). Un tuto ici.
  • Thumbor (un service d’imagerie intelligent qui permet de recadrer, redimensionner, appliquer des filtres et optimiser les images à la demande.
  • Mariadb
  • Redis
  • Keycloak (pour gérer l’OAuth2 et bien plus encore)
  • Traefik. Le coté magique avec lui c’est que vous pourrez avoir plusieurs projets Docker qui utilisent le même port (80 par exemple) lancés en même temps et tous accessibles. Il peut même détecter dynamiquement les nouvelles instances de conteneurs et les ajouter automatiquement à sa configuration.

On lance et on regarde

On commence par éditer notre hosts

  • osx: nano /etc/hosts
  • Linux (Debian based): vim /etc/hosts

en y ajoutant :

127.0.0.1       local.services.fr, local.first-service.fr, local.second-service.fr, local.thumbor.fr, local.maildev.fr, traefik.lh

Puis, une fois le projet git téléchargé, on se place dans le dossier et on up le conteneur.

cd dockerized
docker-compose up -d

Normalement vous devriez voir cela dans votre Docker desktop :

Dockerized dans Docker Desktop

En allant sur http://traefik.lh vous devriez voir votre dashboard Traefik :

Traefik Dashboard

Si on va sur l’onglet HTTP http://traefik.lh/dashboard/#/http/routers on voit que traefik gère déjà le routing de nos services.

Pour accéder à MailDev c’est http://local.maildev.fr/

Pour accéder à MariaDb :

cd dockerized
docker-compose exec mariadb bash
mysql -proot
Sequel Ace configuration pour accéder à la DB (password : root)

Pour Redis :

cd dockerized
docker compose exec redis bash
redis-cli

Et enfin Keyckoak : http://local.services.fr/ (admin/admin)

Nous avons notre base de travail. Vous pouvez bien la modifier en fonction de vos besoins. Maintenant, nous allons créer deux applications avec Docker qui utiliseront notre conteneur Dockerized.

Une App Symfony (first-service.fr) qui utilise notre Dockerized

Pour ne écrire chaque ligne de code ici, j’ai créé un projet Git qui servira de base au tuto et je vais détailler ci-après.

Je vous invite à le télécharger ou le cloner en cliquant ici.

Ici on est sur une installation de base d’un projet Symfony.

Ce qui est important à regarder et propre à notre configuration :

  • le dossier “docker” au premier niveau
  • le fichier “docker-compose”
  • et le fichier “docker-compose.override.yaml”

docker-compose

services:
app_firstservice:
build:
args:
- SYMFONY_ENV=staging
context: .
dockerfile: ./docker/Dockerfile
networks:
- symfony

networks:
symfony:
traefik:
external: true

Ici le point important c’est de définir “traefik” dans networks en “external” pour indiquer à Docker d’aller chercher le networks Traefik de notre conteneur Dockerized qui est en dehors du conteneur actuel. On aura ainsi accès aux services du networks Traefik (MariaDb, Redis …).

le dockerfile va lui s’occuper de l’installation de php 8 + extensions, les libs, loader la conf nginx et exécuter le script d’installation (docker-entrypoint.sh).

Attention a voir un nom différent pour chaque service d’app (ici app_firstservice).

docker-compose.override.yaml

services:
app_firstservice:
build:
args:
- SYMFONY_ENV=dev
volumes:
- ./:/var/www/project/:cached
labels:
- "traefik.http.routers.firstservice.rule=Host(`local.first-service.fr`)"
- traefik.http.routers.firstservice.entrypoints=http
- traefik.http.services.firstservice.loadbalancer.server.port=80
environment:
- SYMFONY_ENV=dev
networks:
- traefik
- symfony

On override la conf pour charger la conf de dev.

Ici c’est les labels qui sont importants. Ils permettent d’indiquer à Traefik ce qu’il doit faire : Rediriger les appels http local.first-service.fr du port 80 vers app_firstservice.

C’est aussi simple que ça ! Vous pouvez avoir 50 apps lancées sur le port 80 et laisser Traefik gérer le routing.

On lance et on regarde

Bien s’assurer que votre hosts comprend :

127.0.0.1       local.first-service.fr

Puis :

cd first_service
docker-compose up -d
docker compose exec app_firstservice bash
composer install

En allant sur http://local.first-service.fr/ vous devriez voir la page de welcome de symfony.

Et sur l’onglet HTTP de Traefik (http://traefik.lh/dashboard/#/http/routers) on peut voir que le host de first-service est bien ajouté :

On peut également constater que la DB first-service à été créée automatiquement via docker-entrypoint.sh

Une App Python (second-service.fr) qui utilise notre Dockerized

Le projet Git qui servira de base au tuto et je vais détailler ci-après :

Je vous invite à le télécharger ou le cloner en cliquant ici.

L’objectif ici c’est d’afficher un simple “hello world” avec un serveur web en Python dans un conteneur Docker.

Bien s’assurer que votre hosts comprend :

127.0.0.1       local.second-service.fr

Puis :

cd second_service
docker-compose up -d

En allant sur http://local.second-service.fr/ vous devriez voir notre hello world. Magique, Traefik a détecté le nouveau service et il a géré le routing.

docker-compose

version: "3.8"

services:
app_secondservice:
build:
context: app/
ports:
- '5000'
networks:
- traefik

networks:
traefik:
external: true

L’installation de Python est réalisée via le build/context qui se trouve dans le dossier app > Dockerfile.

Le fichier Dockerfile load “requirements.txt”, qui est une liste de libs Python qu’on veut installer.

docker-compose.override.yaml

services:
app_secondservice:
labels:
- "traefik.http.routers.appsecondservice.rule=Host(`local.second-service.fr`)"
- traefik.http.routers.appsecondservice.entrypoints=http
- traefik.http.services.appsecondservice.loadbalancer.server.port=5000
networks:
- traefik

Comme expliqué précédemment on indique à Traefik le host et le port.

Traefik va automatiquement router le port 80 vers le 5000 du service Python.

Conclusion

Créer un environnement de dev sous Docker avec traefik est assez simple et change la vie de l’équipe.

Pour aller plus loin, création d’une api REST / GraphQL + tests :

Prochaine étape dans un autre article : utilisation de l’Oauth 2 avec Keycloak pour faire communiquer plusieurs APIs entre elles :

--

--