Editar: Si está utilizando Docker-for-mac o Docker-for-Windows 18.03+, simplemente conéctese a su servicio mysql utilizando el host host.docker.internal
(en lugar de 127.0.0.1
en la cadena de conexión).
A partir de Docker 18.09.3, esto no funciona en Docker-for-Linux. Se presentó una solución el 8 de marzo de 2019 y, con suerte, se fusionará con la base del código. Hasta entonces, una solución alternativa es usar un contenedor como se describe en la respuesta de qoomon .
2020-01: se han realizado algunos progresos . Si todo va bien, esto debería aterrizar en Docker 20.04
TLDR
Úselo --network="host"
en su docker run
comando, luego 127.0.0.1
en su contenedor docker apuntará a su host docker.
Nota: Este modo solo funciona en Docker para Linux, según la documentación .
Nota sobre los modos de red del contenedor Docker
Docker ofrece diferentes modos de red cuando se ejecutan contenedores. Dependiendo del modo que elija, se conectaría a su base de datos MySQL que se ejecuta en el host docker de manera diferente.
docker run --network = "bridge" (predeterminado)
Docker crea un puente nombrado docker0
por defecto. Tanto el host del acoplador como los contenedores del acoplador tienen una dirección IP en ese puente.
en el host Docker, escriba sudo ip addr show docker0
tendrá una salida similar a:
[vagrant@docker:~] $ sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::5484:7aff:fefe:9799/64 scope link
valid_lft forever preferred_lft forever
Así que aquí mi host docker tiene la dirección IP 172.17.42.1
en la docker0
interfaz de red.
Ahora inicie un nuevo contenedor y obtenga un shell en él: docker run --rm -it ubuntu:trusty bash
y dentro del tipo de contenedor ip addr show eth0
para descubrir cómo está configurada su interfaz de red principal:
root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.192/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
valid_lft forever preferred_lft forever
Aquí mi contenedor tiene la dirección IP 172.17.1.192
. Ahora mira la tabla de enrutamiento:
root@e77f6a1b3740:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.17.42.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 * 255.255.0.0 U 0 0 0 eth0
Por lo tanto, la dirección IP del host docker 172.17.42.1
se establece como la ruta predeterminada y se puede acceder desde su contenedor.
root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms
docker run --network = "host"
Alternativamente, puede ejecutar un contenedor acoplable con la configuración de red establecida enhost
. Dicho contenedor compartirá la pila de red con el host del acoplador y, desde el punto de vista del contenedor, localhost
(o 127.0.0.1
) se referirá al host del acoplador.
Tenga en cuenta que cualquier puerto abierto en su contenedor Docker se abriría en el host Docker. Y esto sin requerir la opción -p
u-P
docker run
.
Configuración de IP en mi host docker:
[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
valid_lft forever preferred_lft forever
y desde un contenedor acoplable en modo host :
[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
valid_lft forever preferred_lft forever
Como puede ver, tanto el host Docker como el contenedor Docker comparten exactamente la misma interfaz de red y, como tales, tienen la misma dirección IP.
Conectarse a MySQL desde contenedores
Modo Puente
Para acceder a MySQL que se ejecuta en el host acoplable desde contenedores en modo puente , debe asegurarse de que el servicio MySQL esté escuchando las conexiones en la 172.17.42.1
dirección IP.
Para hacerlo, asegúrese de tener uno bind-address = 172.17.42.1
o bind-address = 0.0.0.0
su archivo de configuración MySQL (my.cnf).
Si necesita establecer una variable de entorno con la dirección IP de la puerta de enlace, puede ejecutar el siguiente código en un contenedor:
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')
luego, en su aplicación, use la DOCKER_HOST_IP
variable de entorno para abrir la conexión a MySQL.
Nota: si usa bind-address = 0.0.0.0
su servidor MySQL, escuchará las conexiones en todas las interfaces de red. Eso significa que se puede acceder a su servidor MySQL desde Internet; asegúrese de configurar las reglas del firewall en consecuencia.
Nota 2: si usa bind-address = 172.17.42.1
su servidor MySQL no escuchará las conexiones realizadas 127.0.0.1
. Los procesos que se ejecutan en el host docker que desearían conectarse a MySQL tendrían que usar la 172.17.42.1
dirección IP.
modo host
Para acceder a MySQL que se ejecuta en el host de Docker desde contenedores en modo host , puede mantener bind-address = 127.0.0.1
su configuración de MySQL y todo lo que necesita hacer es conectarse 127.0.0.1
desde sus contenedores:
[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
nota: usar mysql -h 127.0.0.1
y no mysql -h localhost
; de lo contrario, el cliente MySQL intentaría conectarse utilizando un socket Unix.