hub - download docker image
Acceda a la base de datos del host desde un contenedor acoplable (5)
Si tengo una base de datos mysql ejecutándose en alguna máquina host, y ese host también ejecuta un contenedor docker: ¿Cómo accedería a la base de datos mysql desde el contenedor docker que se ejecuta en el host ?.
Por ejemplo, ¿hay alguna manera de publicar un puerto de hosts en el contenedor (lo contrario de lo que hace Docker run -p)?
De los documentos 18.03:
Quiero conectarme desde un contenedor a un servicio en el host
El host tiene una dirección IP cambiante (o ninguna si no tiene acceso a la red). Desde el 18.03 en adelante, nuestra recomendación es conectarse al nombre DNS especial
host.docker.internal
, que resuelve la dirección IP interna utilizada por el host.También se puede
gateway.docker.internal
puerta de enlace comogateway.docker.internal
.
EJEMPLO: Esto es lo que uso para mi cadena de conexión MySQL dentro de mi contenedor para acceder a la instancia de MySQL en mi host:
mysql://host.docker.internal:3306/my_awesome_database
Desde Docker 17.06 en adelante, un nombre DNS especial solo para Mac está disponible en los contenedores de Docker que se resuelve en la dirección IP del host. Está:
docker.for.mac.localhost
La documentación está aquí: https://docs.docker.com/docker-for-mac/networking/#httphttps-proxy-support
Hay varias discusiones de larga data sobre cómo hacer esto de una manera consistente, bien entendida y portátil. No hay una resolución completa, pero lo vincularé a las discusiones a continuación.
En cualquier caso, es posible que desee intentar usar la opción --add-host para ejecutar Docker para agregar la dirección IP del host en el archivo / etc / host del contenedor. Desde allí, es trivial conectarse al host en cualquier puerto requerido:
Agregar entradas a un archivo de hosts de contenedor
Puede agregar otros hosts al archivo / etc / hosts de un contenedor utilizando uno o más indicadores --add-host. Este ejemplo agrega una dirección estática para un host llamado docker:
$ docker run --add-host=docker:10.180.0.1 --rm -it debian $$ ping docker PING docker (10.180.0.1): 48 data bytes 56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms 56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms ^C--- docker ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms
Nota: a veces necesita conectarse al host Docker, lo que significa obtener la dirección IP del host. Puede usar los siguientes comandos de shell para simplificar este proceso:
$ alias hostip="ip route show 0.0.0.0/0 | grep -Eo ''via /S+'' | awk ''{ print $2 }''" $ docker run --add-host=docker:$(hostip) --rm -it debian
Documentación:
https://docs.docker.com/engine/reference/commandline/run/
Debates sobre cómo acceder al host desde el contenedor:
Otras respuestas no me funcionaron bien. Mi contenedor no pudo resolver la ip del host usando host.docker.internal . Hay dos maneras
-
Compartir red de host --net = host:
docker run -it --net=host myimage
-
Usando la dirección IP de Docker , que generalmente es 172.17.0.1 . Puede verificarlo llamando al comando ifconfig y tomando inet addr de la interfaz docker
user@ubuntu:~$ ifconfig docker0 Link encap:Ethernet HWaddr 02:42:a4:a2:b2:f1 inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:a4ff:fea2:b2f1/64 Scope:Link
Una vez que tenga esta dirección IP, puede pasarla como un argumento para ejecutar Docker y luego a la aplicación o, como lo hago, mapear la ubicación de jdbc.properties a través del volumen al directorio en la máquina host, para que pueda administrar el archivo externamente .
docker run -it -v /host_dir/docker_jdbc_config:${jetty_base}/var/config myimage
NOTA: es posible que su base de datos no permita conexiones externas. En el caso de postgresql, debe editar 2 archivos, como se describe here y here :
-
Edite postgresql.conf para escuchar en todas las direcciones. Por defecto apuntará a localhost.
listen_addresses = ''*''
-
Edite pg_hba.conf para permitir conexiones desde todas las direcciones. Agregue en la última línea:
host all all 0.0.0.0/0 md5
IMPORTANTE: el último paso para actualizar el acceso a la base de datos no se recomienda para uso en producción a menos que esté realmente seguro de lo que está haciendo.
Utilice host.docker.internal desde Docker 18.03 en adelante.