Bonjour,

Comme dit dans le titre, après avoir suivit le tuto sur Environnement de développement basé sur Docker.

J'ai un soucis quand je tente de me connecter à mysql via php ou via un programme tier (ex: Heidi SQL ou Sequel Pro).

J'ai ce message d'erreur quand je tente de me connecter via Sequel Pro alors que les données entrées sont correctes:

Unable to connect to host db, or the request timed out.

Be sure that the address is correct and that you have the necessary privileges, or try increasing the connection timeout (currently 10 seconds).

MySQL said: Can't connect to MySQL server on '127.0.0.1' (4)

Et via php j'ai ceci :

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

J'ai tenté de modifier le bind-address=0.0.0.0 dans my.cnf, mais ça ne change rien.

Quelqu'un aurait une idée ?

6 réponses


PhiSyX
Réponse acceptée

Ha... D'accord.. Bah bizarre, chez moi ça fonctionne comme j'ai expliqué au dessus; effectivement l'ip du containeur est definie de manière aléatoire ^^

Ton php, t'as fait une ptite erreur de syntaxe, host={$this->db_host} au lieu de host:{$this->db_host}.

elhebert
Auteur
Réponse acceptée

@PhiSyX : Oh put***, j'avais même pas vu... étrange que vagrant et wamp acceptaient cette syntaxe (Ils ne plantaient pas mon code php quoi ^^) :o

Du coup, le soucis côté php est réglé, mais je n'arrive toujours pas à me connecter depuis un logiciel tiers (testé depuis Heidi SQL sur ma tour et Sequel Pro sur mon macbook). D'ailleurs, je ne sais pas ce qui s'est passé, mais l'erreur à changer, maintenant j'ai droit à :

Lost connection to MySQL server at 'reading initial communication packet', system error: 0

Peut être que ça aidera à mieux comprendre ce qu'il se passe.

EDIT : Il semblerait que ça fonctionne lorsque j'entre l'ip, mais pas quand j'utilise le nom d'hôte... c'est assez étrange. Bon, au moins ça fonctionne en partie :D

Hello :)

Pour Sequel Pro, tu peux t'y connecter en ssh:
Il te faut l'hôte mysql du container mysql sous docker, l'ip de la machine, l'utilisateur ssh et le mot de passe ssh.

Hôte SSH: <boot2docker ip>
Tu peux le récupérer en tapant la commande: (vu sur le tuto)

$ boot2docker ip
192.168.59.103

Hôte MySQL: <docker_mysql ip>
Tu peux le récupérer en te connectant en ssh et en tapant l'une de ces commandes:

$ docker inspect -f="{{.NetworkSettings.IPAddress}}" docker_nomducontainerMYSQL_1
172.17.0.3

Tu peux aussi faire un "ping nomducontainerMYSQL" dans un container qui est lié à mysql pour récupérer l'hôte. Par exemple si mysql est lié a php: (vu sur le tuto)

$ docker exec -ti docker_nomducontainerPHP_1 bash

$ ping nomducontainerMYSQL

> PING nomducontainerMYSQL (172.17.0.3): 56 data bytes

Utilisateur SSH: docker
Clé SSH: tcuser

Pour php, s'ils sont liés (les containers) un simple "nomducontainerMYSQL" en nom d'hôte et le tour est joué sinon l'hôte mysql (voir Hôte MySQL), je crois :-)

Voili voilou ^^

Bonjour,

Je ne pense pas qu'on puisse utiliser les socket Unix pour se connecter à MySQL avec Docker, il faut passer par une connexion TCP.
l'adresse IP est définie de façon aléatoire par le conteneur MySQL et on peut la récupérer par la variable d'environnement $MYSQL_PORT_3306_TCP_ADDR, à toi à adapter tes scripts côté conteneur client.

elhebert
Auteur

@PhiSyX : C'est en faisant comme ça (via ssh) que j'ai obtenu l'erreur. J'avais testé en utilisant l'ip du conteneur et le nom d'hôte (db comme pour le tuto) mais ni l'un ni l'autre ne fonctionne. Mais merci de ta réponse :)

(J'aurais peut être du le préciser dans mon message ^^)

@Huggy : Je ne comprend pas ce que tu veux dire. L'erreur de connexion via socket est celle retournée par php lorsque je tente une connexion à ma db en utilisant pdo. Comme l'explique Jonathan dans son tuto, il suffit de changer l'hôte soit par l'ip, soit par le nom d'hôte défini lors de la liaison des conteneur (db dans mon cas).

Ma connexion à ma db se fait comme ceci :

new PDO("mysql:dbname={$this->db_name};host:{$this->db_host}", $this->db_user, $this->db_pass)

Tant que j'y suis, j'ai testé une connection à ma db via Adminer et là ça fonctionne. Et tant qu'a faire voici mon docker-compose (qui est quasi le même que celui utiliser par Jonathan dans le tutoriel) :

web:
    build: .
    restart: always
    ports:
        - "80:80"
    volumes:
        - /var/www/sites:/var/www
        - /var/www/docker/conf/php.ini:/etc/php5/apache2/conf.d/30-custom.ini
        - /var/www/docker/apache/sites:/etc/apache2/sites-enabled
    environment:
        - ALLOW_OVERRIDE=true
    links:
        - db:db

db:
    image: mysql
    restart: always
    volumes:
        - /var/lib/boot2docker/mysql:/var/lib/mysql
    environment:
        - MYSQL_ROOT_PASSWORD=root

Voici un lien qui parle du "host mode" qui permet de voir le conteneur dans le même réseau que le host.
du coup on peut laisser bind-address=127.0.01 et les conteneurs client peuvent se connecter à localhost
bien sûr dans ce cas on doit tenir compte des conflits de ports éventuels.