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)
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.
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