nginx - subir - Desde el interior de un contenedor Docker, ¿cómo me conecto al host local de la máquina?




subir imagen a docker hub (12)

Para macOS y Windows

Docker v 18.03 y superior (desde el 21 de marzo de 2018)

Use su dirección IP interna o conéctese al nombre de DNS especial host.docker.internal que se resolverá con la dirección IP interna que usa el host.

Soporte de Linux pendiente https://github.com/docker/for-linux/issues/264

MacOS con versiones anteriores de Docker

Docker para Mac v 17.12 a v 18.02

Igual que el anterior, pero use docker.for.mac.host.internal en docker.for.mac.host.internal lugar.

Docker para Mac v 17.06 a v 17.11

Igual que el anterior, pero usa docker.for.mac.localhost en docker.for.mac.localhost lugar.

Docker para Mac 17.05 e inferior

Para acceder a la máquina host desde el contenedor de la ventana acoplable, debe adjuntar un alias de IP a su interfaz de red. Puede enlazar cualquier IP que desee, solo asegúrese de no usarla para nada más.

sudo ifconfig lo0 alias 123.123.123.123/24

Luego, asegúrese de que su servidor esté escuchando la IP mencionada anteriormente o 0.0.0.0 . Si está escuchando en localhost 127.0.0.1 , no aceptará la conexión.

Luego simplemente apunte su contenedor de la ventana acoplable a esta IP y podrá acceder a la máquina host

Para probar puedes ejecutar algo como curl -X GET 123.123.123.123:3000 dentro del contenedor.

El alias se reiniciará en cada reinicio, así que cree un script de inicio si es necesario.

Solución y más documentación aquí: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

Entonces tengo un Nginx corriendo dentro de un contenedor docker, tengo un mysql corriendo en localhost, quiero conectarme al MySql desde mi Nginx. El MySql se ejecuta en localhost y no está exponiendo un puerto al mundo exterior, por lo que está vinculado en localhost, no en la dirección IP de la máquina.

¿Hay alguna manera de conectarse a este MySql o cualquier otro programa en localhost desde este contenedor docker?


Aquí está mi solución: funciona para mi caso.

  • configurar el servidor mysql local para acceso público mediante el comentario #bind-address = 127.0.0.1 en /etc/mysql/mysql.conf.d

  • reiniciar el servidor mysql sudo /etc/init.d/mysql restart

  • ejecute el siguiente comando para abrir el usuario root acceda a cualquier host mysql -uroot -proot GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES; mysql -uroot -proot GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;

  • crear sh script: run_docker.sh

    #!bin/bash

    HOSTIP=`ip -4 addr show scope global dev eth0 | grep inet | awk '{print \$2}' | cut -d / -f 1`


      docker run -it -d --name web-app \
                  --add-host=local:${HOSTIP} \
                  -p 8080:8080 \
                  -e DATABASE_HOST=${HOSTIP} \
                  -e DATABASE_PORT=3306 \
                  -e DATABASE_NAME=demo \
                  -e DATABASE_USER=root \
                  -e DATABASE_PASSWORD=root \
                  sopheamak/springboot_docker_mysql

  
  • correr con docker-compositor

    version: '2.1'
    
    

    services:
    tomcatwar: extra_hosts: - "local:10.1.2.232" image: sopheamak/springboot_docker_mysql
    ports: - 8080:8080 environment: - DATABASE_HOST=local - DATABASE_USER=root - DATABASE_PASSWORD=root - DATABASE_NAME=demo - DATABASE_PORT=3306


Estoy haciendo un truco similar a las publicaciones anteriores de obtener la IP local para asignar un nombre de alias (DNS) en el contenedor. El principal problema es obtener dinámicamente con un script simple que funciona tanto en Linux como en OSX, la dirección IP del host . Hice este script que funciona en ambos entornos (incluso en la distribución de Linux con "$LANG" != "en_*" configurado):

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1

Entonces, utilizando Docker Compose, la configuración completa será:

Script de inicio (docker-run.sh) :

export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)
docker-compose -f docker-compose.yml up

docker-compose.yml :

myapp:
  build: .
  ports:
    - "80:80"
  extra_hosts:
    - "dockerhost:$DOCKERHOST"

Luego, cambie http://localhost a http://dockerhost en su código.

Para obtener una guía más avanzada sobre cómo personalizar el script DOCKERHOST , eche un vistazo a esta publicación con una explicación de cómo funciona.


Ninguna de las respuestas funcionó para mí cuando usé Docker Toolbox en Windows 10 Home, pero 10.0.2.2 sí, ya que docker-toolbox usa VirtualBox, que expone al host a la VM en esta dirección.


Para aquellos en Windows, suponiendo que esté utilizando el controlador de red de puente, querrá vincular específicamente MySQL a la dirección IP de la interfaz de red de Hyper-V.

Esto se realiza a través del archivo de configuración en la carpeta C: \ ProgramData \ MySQL normalmente oculta.

La unión a 0.0.0.0 no funcionará. La dirección necesaria también se muestra en la configuración de la ventana acoplable, y en mi caso fue 10.0.75.1.


Puede usar ngrok para crear un túnel seguro para su máquina localhost y luego exponer ese túnel a su contenedor docker.

ngrok es de uso gratuito a partir del 22/05/2017.

Pasos:

1) ir a ngrok

2) download el cliente ngrok y siga las instrucciones de instalación

3) INSCRÍBASE para obtener una cuenta y le proporcionarán un token de autenticación. Es necesario registrarse porque ngrok solo le otorga el túnel de puerto tcp después de registrarse. No hay costo o tarjeta de crédito requerida para registrarse.

4) En su terminal haga ngrok tcp 3306 . 3306 es el puerto que mysql ejecuta en mi local, también puede hacerlo con cualquier otro puerto.

5) Recibirá una dirección del paso 4 como esta: tcp://0.tcp.ngrok.io:10117 . Esta es la conexión del túnel a su máquina local. 0.tcp.ngrok.io se asigna a su 0.tcp.ngrok.io localhost y el puerto 10117 se asigna a su puerto 3306 local. Ahora puede acceder a su puerto localhost 3306 desde cualquier lugar con esta dirección, incluido cualquier contenedor acoplable que se ejecute en esta máquina. En su contenedor docker (donde sea que esté), asumiendo que ya tiene instalado el cliente mysql, haga lo siguiente:

mysql --host 0.tcp.ngrok.io --port 10117 -u root

¡Podrá iniciar sesión en su cuenta root de su máquina local desde dentro del contenedor de la ventana acoplable!

He blogeado sobre esta solución, vea más detalles here


Solución para Linux (kernel> = 3.6).

Ok, su servidor localhost tiene una interfaz de docker predeterminada docker0 con dirección IP 172.17.0.1 . Su contenedor comenzó con la configuración de red predeterminada --net = "puente" .

  1. Habilitar route_localnet para la interfaz docker0:
    $ sysctl -w net.ipv4.conf.docker0.route_localnet=1
  2. Agrega estas reglas a iptables:
    $ iptables -t nat -I PREROUTING -i docker0 -d 172.17.0.1 -p tcp --dport 3306 -j DNAT --to 127.0.0.1:3306
    $ iptables -t filter -I INPUT -i docker0 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
  3. Cree un usuario mysql con acceso desde '%' que significa - desde cualquier persona, excluyendo localhost:
    CREATE USER 'user'@'%' IDENTIFIED BY 'password';
  4. Cambie en su script la dirección del servidor mysql a 172.17.0.1


De la documentación del núcleo :

route_localnet - BOOLEAN: no considere las direcciones de bucle invertido como origen o destino marciano mientras enruta. Esto permite el uso de 127/8 para propósitos de enrutamiento local ( valor predeterminado FALSO ).


hasta que host.docker.internal funcione para todas las plataformas, puede usar mi contenedor actuando como una puerta de enlace NAT sin ninguna configuración manual https://github.com/qoomon/docker-host


Edit: terminé haciendo un prototipo del concepto en GitHub. Echa un vistazo a: https://github.com/sivabudh/system-in-a-box

Primero, mi respuesta está dirigida a 2 grupos de personas: aquellos que usan una Mac y aquellos que usan Linux.

El modo de red del host no funciona en una Mac. Debe utilizar un alias de IP, consulte: https://.com/a/43541681/2713729

¿Qué es un modo de red host? Consulte: https://docs.docker.com/engine/reference/run/#/network-settings

En segundo lugar, para aquellos de ustedes que están usando Linux (mi experiencia directa fue con Ubuntu 14.04 LTS y pronto estaré actualizando a 16.04 LTS en producción), , puede hacer que el servicio que se ejecuta dentro de un contenedor Docker se conecte a los servicios de localhost el host Docker (por ejemplo, su computadora portátil).

¿Cómo?

La clave es cuando ejecutas el contenedor Docker, debes ejecutarlo con el modo de host . El comando se ve así:

docker run --network="host" -id <Docker image ID>

Cuando realice un ifconfig (necesitará apt-get install net-tools su contenedor para que el ifconfig sea ​​invocable) dentro de su contenedor, verá que las interfaces de red son las mismas que las del host Docker (por ejemplo, su computadora portátil ).

Es importante tener en cuenta que soy un usuario de Mac, pero ejecuto Ubuntu bajo Parallels, por lo que usar una Mac no es una desventaja. ;-)

Y así es como se conecta el contenedor NGINX al MySQL que se ejecuta en un host localhost .


La solución más simple para Mac OSX

Solo usa la dirección IP de tu Mac. En la Mac, ejecute esto para obtener la dirección IP y utilícela desde dentro del contenedor:

$ ifconfig | grep 'inet 192'| awk '{ print $2}'

Mientras el servidor que se ejecuta localmente en su Mac o en otro contenedor de la ventana acoplable escuche 0.0.0.0, el contenedor de la ventana acoplable podrá comunicarse con esa dirección.

Si solo desea acceder a otro contenedor de la ventana acoplable que está escuchando en 0.0.0.0, puede usar 172.17.0.1


Para la máquina de Windows: -

Ejecute el siguiente comando para exponer el puerto de la ventana acoplable aleatoriamente durante el tiempo de construcción

$docker run -d --name MyWebServer -P mediawiki

En la lista de contenedores anterior puede ver el puerto asignado como 32768. Intente acceder

localhost:32768 

Puedes ver la página de mediawiki.


Solución para Windows 10

Docker Community Edition 17.06.0-ce-win18 2017-06-28 (estable)

Puede usar el nombre DNS del host docker.for.win.localhost para resolver la IP interna. (Advertencia algunas fuentes mencionan windows pero debería ser win )

Visión general
Necesitaba hacer algo similar, es decir, conectar desde mi contenedor Docker a mi host local, que ejecutaba el Azure Storage Emulator y el CosmosDB Emulator .

El Azure Storage Emulator escucha de forma predeterminada el 127.0.0.1 , mientras que también puede cambiar la IP de su límite, estaba buscando una solución que funcionara con la configuración predeterminada.

Esto también funciona para conectar desde mi contenedor Docker a SQL Server e IIS , ambos ejecutándose localmente en mi host con la configuración de puerto predeterminada.





docker-networking