web-dev-qa-db-fra.com

Connectez-vous à MySQL sur localhost à partir du conteneur Docker

J'ai mysql en cours d'exécution sur mon hôte local, je peux le connecter en exécutant:

mysql -h 127.0.0.1 -P 3306 -u root -p

J'ai également exécuté le conteneur Docker avec la commande:

docker run -tid -v $(pwd):/code -p 3306:3306 -p 5000:5000 --name container container

Et je veux accéder à ma base de données Mysql à partir du conteneur Docker. Je tape donc aussi depuis le docker container:

mysql -h 127.0.0.1 -P 3306 -u root -p

Mais cela me donne une erreur:

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

Qu'est-ce que je fais mal? Les ports semblent être corrects. EDIT 1 Sortie de ifconfig dans docker:

eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1780 errors:0 dropped:0 overruns:0 frame:0
          TX packets:977 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2225781 (2.2 MB)  TX bytes:56572 (56.5 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:28 errors:0 dropped:0 overruns:0 frame:0
          TX packets:28 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:1400 (1.4 KB)  TX bytes:1400 (1.4 KB)
12
Snobby

Même si vous configurez mysql pour écouter sur toutes les interfaces, puis à partir de votre conteneur accéder à mysql à partir d'une IP non bouclée, vous pouvez trouver que les règles de routage, de nat et de pare-feu des dockers ne vous permettent pas d'accéder aux services en cours d'exécution sur l'hôte. La solution rapide pour cela consiste à exécuter votre conteneur sur la pile du réseau hôte avec:

docker run -tid -v $(pwd):/code -p 3306:3306 -p 5000:5000 \
  --name container --net Host container

Vous pouvez également déplacer mysql à l'intérieur d'un conteneur fonctionnant sur le même réseau de dockers, puis y accéder via le nom du conteneur à l'aide de la découverte du service DNS de docker.

4
BMitch

Utilisez l'itinéraire par défaut. Par exemple:

~# ip route show | grep "default" | awk '{print $3}'
172.18.0.1

puis

mysql -h 172.18.0.1 -P 3306 -u root -p

si vous avez besoin d'automatiser cela, disons, utilisez cette IP sur un script Shell, envoyez-la à un script Shell, prenez-la comme:

Host=$(ip route show | grep \"default\" | awk '{print $3}' | xargs echo -n)

alors vous avez l'adresse IP hôte sur $Host

4
Webert Lima