Accéder à une base de données dans un conteneur Docker
L'utilisation de Docker est généralisée pour l'ensemble des applications développée de nos jours. Avec ce tutoriel, nous allons voir comment lancer une base de données dans un conteneur Docker puis comment y accéder depuis son terminal et également depuis une application lancée dans un autre conteneur.
PostgreSQL dans Docker
Nous choisissons PostgreSQL pour base de données. Ce choix populaire nous permet de bénéficier d'une image officielle➶ disponible sur dockerhub. Étant donné que nous nous plaçons dans le contexte d'un développement applicatif, nous allons rédiger un fichier compose.yaml afin de lancer facilement nos conteneurs sans avoir à retenir leurs configurations.
Cependant avant cela, nous allons installer un client PostgreSQL afin d'accéder à notre base de données depuis notre terminal, j'ai nommé psql. Sous Fedora, l'installation se fait avec la commande suivante :
$ sudo dnf install postgresql
Pour avoir une version compatible entre notre client psql et la base de données PostgreSQL qui va être dans le conteneur Docker, nous vérifions la version de psql qui a été installée.
$ psql --version
psql (PostgreSQL) 16.8
Nous remarquons que c'est la verion 16.8 du client qui a été installée, c'est donc cette version de l'image que nous allons utiliser pour lancer notre conteneur.
# compose.yaml
name: my-test
services:
db:
container_name: database
image: postgres:16.8
ports:
- "25432:5432"
environment:
- POSTGRES_PASSWORD=secret # obligatoire
Une fois le fichier compose.yaml
enregistré, nous allons accéder à son répertoire et y lancer la commande suivante pour démarrer le conteneur Docker de PostgreSQL :
$ docker compose up -d
✔ Container database Started
- Pour accéder aux données de PostgreSQL via notre terminal, deux options s'offrent à nous :
- soit on passe par le conteneur Docker puis on lance psql,
- soit on lance psql depuis la machine hôte du conteneur.
Pour démarrer un shell dans le conteneur Docker et y lancer psql, voici les commandes à exécuter :
$ docker exec -it database bash
# à partir d'ici nous sommes dans le conteneur
$ psql -h localhost -U postgres
Pour lancer psql directement depuis votre machine, voici la commande à exécuter :
$ psql -h localhost -U postgres -p 25432
# entrer le mot de passe du fichier compose.yaml
On remarque que si nous souhaitons passer par le client psql de notre machine, il nous faut préciser le port 25432
. En effet 25432
n'est pas le port par défaut qu'écoute PostgreSQL et comme nous avec fait la redirection de port 25432:5432
entre le conteneur et notre machine, on ne peut pas laisser psql deviner le port à utiliser.
Accès à PostgreSQL depuis une application Dockerisée
Supposons maintenant que nous développons une application nécessitant un accès à la base de données et que nous la lançons dans un conteneur Docker différent de celui de la base de données. La question est donc de savoir quels paramètres renseigner pour nous connecter à PostgreSQL.
Pour que l'application puisse se connecter à la base de données, il faut déjà que les deux conteneurs Docker partagent un même réseau bridge Docker. Modifions notre fichier compose.yaml dans ce sens :
# compose.yaml
name: my-test
services:
db:
container_name: database
image: postgres:16.8
networks:
- my-network
ports:
- "25432:5432"
environment:
- POSTGRES_PASSWORD=secret
app:
container_name: appli
image: my-image
networks:
- my-network
Maintenant, il ne nous reste plus qu'à nous connecter à la base de données depuis notre application. Étant donné que le conteneur de l'application et de la base de données sont sur le même réseau, nous utiliserons cette fois-ci le port 5432
pour nous connecter à PostgreSQL.
; db.clj
(ns example.db
(:require [clojure.java.jdbc :as jdbc])
(:import (com.mchange.v2.c3p0 ComboPooledDataSource)))
(defn pool
[dbname user password]
(doto (ComboPooledDataSource.)
(.setDriverClass "org.postgresql.Driver")
(.setJdbcUrl (str "jdbc:postgresql://database:5432/" dbname))
(.setUser user)
(.setPassword password)))
On remarquera que pour accéder à la base de données, il nous suffit de mettre le nom du conteneur de PostgreSQL en tant qu'hôte dans l'adresse de connexion.