docker - library - Cómo obtener la dirección IP del host de la ventana acoplable desde dentro de un contenedor de la ventana acoplable
docker run (14)
Como dice el título. Necesito poder recuperar la dirección IP de los hosts de la ventana acoplable y los mapas de puertos del host al contenedor, y hacerlo dentro del contenedor.
Actualización: en Docker para Mac , a partir de la versión 18.03, puede usar host.docker.internal como IP del host. Ver la respuesta de allanberry . Para versiones anteriores de Docker para Mac, la siguiente respuesta puede ser útil:
En Docker para Mac, el puente docker0
no existe, por lo que otras respuestas aquí pueden no funcionar. Sin embargo, todo el tráfico saliente se enruta a través de su host principal, por lo que siempre que intente conectarse a una IP que reconozca como tal (y que el contenedor de la ventana acoplable no cree que sea él mismo) debe poder conectarse. Por ejemplo, si ejecuta esto desde la máquina principal, ejecute:
ipconfig getifaddr en0
Esto debería mostrarle la IP de su Mac en su red actual y el contenedor de la ventana acoplable también debería poder conectarse a esta dirección. Por supuesto, esto es un problema si esta dirección IP cambia alguna vez, pero puede agregar una IP de bucle invertido personalizada a su Mac que el contenedor no cree que sea en sí misma haciendo algo como esto en la máquina principal:
sudo ifconfig lo0 alias 192.168.46.49
A continuación, puede probar la conexión desde el contenedor de la ventana acoplable con telnet. En mi caso, quería conectarme a un servidor xdebug remoto:
telnet 192.168.46.49 9000
Ahora, cuando el tráfico ingrese a su Mac para 192.168.46.49 (y todo el tráfico que sale de su contenedor pasa por su Mac), su Mac asumirá que la IP es en sí misma. Cuando termine de usar esta IP, puede eliminar el alias de bucle de retorno de esta manera:
sudo ifconfig lo0 -alias 192.168.46.49
Una cosa a tener en cuenta es que el contenedor de la ventana acoplable no enviará tráfico al host principal si cree que el destino del tráfico es el mismo. Así que revise la interfaz de bucle de retorno dentro del contenedor si tiene problemas:
sudo ip addr show lo
En mi caso, esto mostró inet 127.0.0.1/8
que significa que no pude usar ninguna IP en el rango 127.*
. Es por eso que utilicé 192.168.*
En el ejemplo anterior. Asegúrese de que la IP que utiliza no esté en conflicto con algo en su propia red.
Aquí hay otra opción para aquellos que ejecutan Docker en AWS. Esta opción evita tener que usar apk para agregar el paquete de rizos y guarda los preciosos 7 MB de espacio. Use el wget incorporado (parte del binario monolítico BusyBox):
wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4
Así es como lo hago. En este caso, agrega una entrada de hosts a / etc / hosts dentro de la imagen de docker que apunta taurus-host a mi máquina local IP::
TAURUS_HOST=`ipconfig getifaddr en0`
docker run -it --rm -e MY_ENVIRONMENT=''local'' --add-host "taurus-host:${TAURUS_HOST}" ...
Luego, desde dentro del contenedor Docker, el script puede usar el nombre de host taurus-host para salir a mi máquina local que alberga el contenedor docker.
Con https://docs.docker.com/machine/install-machine/
a) $ docker-machine ip
b) Obtener la dirección IP de una o más máquinas.
$ docker-machine ip host_name $ docker-machine ip host_name1 host_name2
El --add-host
podría ser una solución más limpia (pero sin la parte del puerto, solo el host puede manejarse con esta solución). Entonces, en su comando de docker run
, haga algo como:
docker run --add-host dockerhost:`/sbin/ip route|awk ''/default/ { print $3}''` [my container]
(Desde https://.com/a/26864854/127400 )
En Docker para Mac , a partir de la versión 18.03, puede usar host.docker.internal
como IP del host.
Tenga en cuenta, como en la documentation , "Esto es para fines de desarrollo [s] y no funcionará en un entorno de producción fuera de Docker para Mac". Esto se debe a que, en Docker para Mac, "no se puede ver una interfaz docker0 en el host. Esta interfaz está realmente dentro de la máquina virtual".
Esta es una actualización de docker.for.mac.localhost
, disponible desde la versión 17.06, y docker.for.mac.host.internal
, disponible desde la versión 17.12, que también puede funcionar.
Por ejemplo, tengo variables de entorno establecidas en mi host:
MONGO_SERVER=host.docker.internal
En mi archivo docker-compose.yml
, tengo esto:
version: ''3''
services:
api:
build: ./api
volumes:
- ./api:/usr/src/app:ro
ports:
- "8000"
environment:
- MONGO_SERVER
command: /usr/local/bin/gunicorn -c /usr/src/app/gunicorn_config.py -w 1 -b :8000 wsgi
En linux puedes correr
HOST_IP=`hostname -I | awk ''{print $1}''`
En macOS su máquina host no es el host Docker. Docker instalará su sistema operativo host en VirtualBox.
HOST_IP=`docker run busybox ping -c 1 docker.for.mac.localhost | awk ''FNR==2 {print $4}'' | sed s''/.$//''`
La única forma es pasar la información del host como entorno cuando creas un contenedor
run --env <key>=<value>
Para aquellos que ejecutan Docker en AWS, los metadatos de instancia para el host todavía están disponibles desde el interior del contenedor.
curl http://169.254.169.254/latest/meta-data/local-ipv4
Por ejemplo:
$ docker run alpine /bin/sh -c "apk update ; apk add curl ; curl -s http://169.254.169.254/latest/meta-data/local-ipv4 ; echo"
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
v3.3.1-119-gb247c0a [http://dl-cdn.alpinelinux.org/alpine/v3.3/main]
v3.3.1-59-g48b0368 [http://dl-cdn.alpinelinux.org/alpine/v3.3/community]
OK: 5855 distinct packages available
(1/4) Installing openssl (1.0.2g-r0)
(2/4) Installing ca-certificates (20160104-r2)
(3/4) Installing libssh2 (1.6.0-r1)
(4/4) Installing curl (7.47.0-r0)
Executing busybox-1.24.1-r7.trigger
Executing ca-certificates-20160104-r2.trigger
OK: 7 MiB in 15 packages
172.31.27.238
$ ifconfig eth0 | grep -oP ''inet addr:/K/S+''
172.31.27.238
Si desea una dirección IP
real (no una IP
puente) en Windows
y tiene una ventana acoplable 18.03
(o más reciente), haga lo siguiente:
Ejecute bash en el contenedor desde el host donde el nombre de la imagen es nginx
(funciona en la Alpine Linux distribution
):
$ docker-machine ip host_name
$ docker-machine ip host_name1 host_name2
Luego correr dentro del contenedor
/ # nslookup host.docker.internal Name: host.docker.internal Address 1: 192.168.65.2
192.168.65.2
es la IP del host, no la IP del puente como en la respuesta aceptada de spinus
.
Estoy usando aquí host.docker.internal :
El host tiene una dirección IP cambiante (o ninguna si no tiene acceso a la red). A partir de la 18.03, nuestra recomendación es conectarse al nombre de DNS especial host.docker.internal, que se resuelve en la dirección IP interna utilizada por el host. Esto es para fines de desarrollo y no funcionará en un entorno de producción fuera de Docker para Windows.
Si está ejecutando un contenedor de Windows en un clúster de Service Fabric, la dirección IP del host está disponible a través de la variable de entorno Fabric_NodeIPOrFQDN
. Variables de entorno de Service Fabric
Si habilitó la API remota de la tcp://0.0.0.0:4243
acoplable (a través de -H
tcp://0.0.0.0:4243
por ejemplo) y sabe el nombre de host o la dirección IP de la máquina host, esto se puede hacer con mucho bash.
Dentro de la base de usuario de mi contenedor:
export hostIP=$(ip r | awk ''/default/{print $3}'')
export containerID=$(awk -F/ ''/docker/{print $NF;exit;}'' /proc/self/cgroup)
export proxyPort=$(
curl -s http://$hostIP:4243/containers/$containerID/json |
node -pe ''JSON.parse(require("fs").readFileSync("/dev/stdin").toString()).NetworkSettings.Ports["DESIRED_PORT/tcp"][0].HostPort''
)
La segunda línea toma el ID del contenedor de su archivo local /proc/self/cgroup
.
La tercera línea se desvía hacia la máquina host (asumiendo que está usando 4243 como puerto de DESIRED_PORT
) y luego usa el nodo para analizar el JSON devuelto para DESIRED_PORT
.
Docker para Mac 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). A partir de la 18.03, nuestra recomendación es conectarse al nombre de DNS especial host.docker.internal, que se resuelve en la dirección IP interna utilizada por el host.
La puerta de enlace también es accesible como gateway.docker.internal. https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
/sbin/ip route|awk ''/default/ { print $3 }''
Como @MichaelNeale notó, no tiene sentido usar este método en Dockerfile
(excepto cuando necesitamos esta IP solo durante el tiempo de compilación), ya que esta IP estará codificada durante el tiempo de compilación.