DevOps

SQLSTATE[HY000] [2002] Connection refused : Quand Laravel ne trouve plus MySQL dans Docker

Decouvrez pourquoi Laravel perd la connexion MySQL dans Docker et comment corriger le Connection refused en exposant le port sur localhost.

14 Feb 2026 4 min de lecture 27 vues
27

Lectures

4

Minutes

0

Partages

Lorsque vous développez une application web avec Laravel, l'interaction avec la base de données est cruciale pour garantir une performance optimale et une expérience utilisateur fluide. Cependant, même les développeurs les plus expérimentés peuvent rencontrer des erreurs inattendues qui peuvent être frustrantes à résoudre. Une des erreurs fréquentes rencontrées lors de l'utilisation de Docker pour gérer vos conteneurs est : SQLSTATE[HY000] [2002] Connection refused. Cette erreur survient souvent lorsque votre application Laravel est incapable de se connecter à votre base de données MySQL hébergée dans un conteneur Docker.

Ce problème peut sembler déroutant à première vue, mais avec une compréhension approfondie de la gestion des adresses IP dans Docker et de la configuration de Laravel, il est possible de le résoudre efficacement. Dans cet article, nous allons explorer en détail pourquoi cette erreur se produit, les solutions possibles pour la résoudre, et les bonnes pratiques à adopter pour éviter qu'elle ne se reproduise.

Comprendre le contexte de l'erreur

Avant de plonger dans les solutions, il est important d'examiner le contexte dans lequel cette erreur se produit. Dans un environnement Docker, chaque conteneur est attribué une adresse IP dynamique. Cela signifie que si votre application n'est pas correctement configurée pour gérer ces adresses dynamiques, des problèmes de connexion peuvent survenir. Dans notre cas, nous avons une application Laravel qui se connecte à une base de données MySQL située dans un conteneur Docker.

Configuration typique dans Docker

Dans un environnement de développement Docker, il est courant d'avoir plusieurs conteneurs fonctionnant ensemble. Un conteneur peut héberger l'application Laravel tandis qu'un autre conteneur héberge la base de données MySQL. Ces conteneurs communiquent entre eux via le réseau Docker.


version: '3.1'
services:
  app:
    image: laravel_app
    ports:
      - "8000:8000"
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: laravel
    ports:
      - "3306:3306"

Dans cet exemple, nous avons deux services : app pour l'application Laravel et db pour la base de données MySQL. Le service db expose le port 3306, qui est le port par défaut pour MySQL.

Causes possibles de l'erreur

Plusieurs facteurs peuvent provoquer l'erreur SQLSTATE[HY000] [2002] Connection refused. Explorons chacune de ces causes possibles :

1. Mauvaise configuration de l'hôte de la base de données

Un problème courant est l'utilisation d'une adresse IP statique ou d'un nom d'hôte incorrect dans le fichier de configuration de Laravel. Dans Docker, il est préférable d'utiliser le nom du service Docker (par exemple, db) comme hôte de la base de données.

2. Conteneur de base de données non démarré

Si le conteneur MySQL n'est pas démarré ou rencontre des problèmes lors du démarrage, l'application Laravel ne pourra pas établir de connexion. Il est important de vérifier l'état de vos conteneurs.

3. Problèmes de réseau Docker

Des problèmes de réseau peuvent également être à l'origine de l'erreur. Assurez-vous que vos conteneurs sont sur le même réseau Docker et qu'ils peuvent communiquer entre eux.

Solutions pour résoudre l'erreur

Maintenant que nous avons identifié les causes possibles, examinons les solutions pour résoudre cette erreur :

1. Vérifier et mettre à jour la configuration de Laravel

Assurez-vous que le fichier .env de votre application Laravel est correctement configuré pour se connecter à votre conteneur MySQL. Utilisez le nom du service Docker comme hôte :


DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

2. Redémarrer les conteneurs Docker

Si la configuration est correcte mais que le problème persiste, essayez de redémarrer vos conteneurs Docker. Cela peut aider à rétablir les connexions réseau entre les conteneurs :


docker-compose down
docker-compose up -d

3. Vérifier les logs de Docker

Consultez les logs de vos conteneurs Docker pour identifier d'éventuels messages d'erreur qui pourraient indiquer la cause du problème :


docker-compose logs db

Bonnes pratiques pour éviter l'erreur

Pour éviter que cette erreur ne se reproduise à l'avenir, voici quelques bonnes pratiques à suivre :

1. Utiliser des réseaux Docker personnalisés

Créez des réseaux Docker personnalisés pour vos projets afin de garantir que tous vos conteneurs peuvent communiquer entre eux de manière fiable.

2. Automatiser le démarrage des conteneurs

Utilisez des scripts ou des outils d'orchestration pour automatiser le démarrage et l'arrêt de vos conteneurs. Cela garantit que tous les services démarrent dans le bon ordre.

3. Surveillance et alertes

Implémentez des outils de surveillance et des alertes pour détecter rapidement les problèmes de connexion et d'autres anomalies dans votre environnement Docker.

Cas d'usage réels

De nombreux développeurs ont rencontré cette erreur lors du développement d'applications Laravel avec Docker. Voici quelques exemples de cas d'usage réels :

Application de gestion d'inventaire

Un développeur travaillant sur une application de gestion d'inventaire a rencontré cette erreur après avoir mis à jour la version de Docker. La solution a été de mettre à jour la configuration du réseau Docker pour résoudre les problèmes de communication entre les conteneurs.

Site de commerce électronique

Un site de commerce électronique rencontrait des interruptions aléatoires de la connexion à la base de données. En investiguant, il a été découvert que certains conteneurs n'étaient pas configurés pour redémarrer automatiquement en cas de panne, provoquant des erreurs de connexion intermittentes.

Comparaison avec d'autres environnements

Il est également utile de comparer comment cette erreur se manifeste dans différents environnements de développement :

Environnement Fréquence de l'erreur Complexité de résolution
Docker Élevée Moyenne
Serveur local (XAMPP/WAMP) Faible Faible
Serveurs cloud (AWS, Azure) Moyenne Élevée

Recapitulatif

L'erreur SQLSTATE[HY000] [2002] Connection refused peut être un véritable casse-tête, surtout pour les développeurs utilisant Docker pour la première fois. Elle est souvent causée par une mauvaise configuration réseau ou une mauvaise gestion des conteneurs. En suivant les bonnes pratiques et en adoptant une approche méthodique pour diagnostiquer et résoudre les problèmes, vous pouvez éviter les interruptions de service et garantir une connexion stable à votre base de données MySQL.

Conseil pro : Gardez toujours vos configurations à jour et documentées. Cela facilite le dépannage et le partage d'informations avec votre équipe de développement.

Comprendre l'architecture réseau Docker

La plupart des erreurs de connexion dans Docker proviennent d'une mauvaise compréhension du réseau interne Docker. Contrairement à un environnement traditionnel, localhost dans un conteneur fait référence au conteneur lui-même, pas à l'hôte ou aux autres conteneurs.

Les réseaux Docker expliqués

# Lister les réseaux Docker existants
docker network ls

# Inspecter un réseau spécifique (voir les conteneurs connectés)
docker network inspect nom_du_reseau

# Voir les conteneurs d'un réseau avec leurs IPs
docker inspect portfolio-mysql | grep -A 20 "Networks"

Configuration correcte dans docker-compose.yml

Voici la configuration recommandée pour que Laravel communique avec MySQL via Docker Compose :

version: '3.8'

services:
  app:
    build: .
    depends_on:
      mysql:
        condition: service_healthy
    environment:
      DB_HOST: mysql        # Nom du service, PAS localhost
      DB_PORT: 3306
      DB_DATABASE: portfolio
      DB_USERNAME: portfolio
      DB_PASSWORD: secret
    networks:
      - app-network

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: portfolio
      MYSQL_USER: portfolio
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: rootsecret
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

Conseil pro : Utilisez toujours depends_on avec condition: service_healthy et configurez un healthcheck sur MySQL. Sans cela, Laravel tente de se connecter avant que MySQL soit prêt, causant exactement l'erreur SQLSTATE[HY000] [2002].

Diagnostic pas à pas de l'erreur

# Étape 1 : Vérifier que le conteneur MySQL tourne
docker ps | grep mysql

# Étape 2 : Vérifier les logs MySQL pour des erreurs
docker logs portfolio-mysql --tail=50

# Étape 3 : Tester la connexion depuis le conteneur app
docker exec -it portfolio-app bash
mysql -h mysql -u portfolio -p

# Étape 4 : Vérifier que DB_HOST dans .env est correct
docker exec portfolio-app cat .env | grep DB_

# Étape 5 : Vider le cache de configuration Laravel
docker exec portfolio-app php artisan config:clear

Causes fréquentes et solutions

CauseSymptômeSolution
DB_HOST=localhost dans .envSQLSTATE [HY000] [2002]Remplacer par le nom du service MySQL
MySQL pas encore prêtConnection refused au démarrageAjouter healthcheck + depends_on
Conteneurs sur réseaux différentsNo route to hostMettre les deux sur le même network
Port 3306 non exposéConnection refused depuis l'hôteAjouter ports: "3306:3306"
Cache config Laravel obsolèteAncienne valeur de DB_HOST utiliséephp artisan config:clear

Tags

MySQL Docker Linux Laravel

Partagez cet article

Twitter Facebook LinkedIn
JY
Jordane YENO

Developpeur Full Stack passionne par le web et les nouvelles technologies

En savoir plus

Articles similaires