tipos redes interfaz entre dockers detener crear contenedor comunicacion windows docker virtualbox

windows - redes - interfaz de red docker



Cómo conectarse a un contenedor acoplable desde fuera del host(misma red) (6)

He creado mi primer contenedor Docker, está ejecutando un servidor usando Go pero no puedo acceder desde fuera de la computadora host. Acabo de comenzar con Docker, así que estoy un poco perdido aquí.

Así que tengo un código Go muy simple que inicia un servidor, he creado la imagen del acoplador que instala Go y genera el código en una imagen base de Linux. Estoy ejecutando el servidor en el puerto 8080, así que expongo ese puerto al host que ejecuta el contenedor de esta manera:

docker run -p 8080:8080 dockertest

Eso funciona y puedo acceder al servidor a través de la IP de la máquina de Docker (la que aparece en el Docker Quickstart Terminal cuando se inicia), el problema es que no puedo acceder al sitio web que estoy alojando desde fuera del host, así que si lo intento para abrir la misma dirección IP en mi teléfono, solo me da un error: esta página web no está disponible (ERR_CONNECTION_TIMED_OUT).

También he intentado especificar la IP de esta manera:

docker run -p 192.168.0.157:8080:8080 dockertest

Pero cuando hago eso, puedo acceder al sitio web a través de la IP de la máquina acoplable ni de la IP especificada en la línea de comando anterior. Tampoco estoy seguro de qué IP se supone que debo escribir en ese comando. Utilicé la IP de mi computadora, también probé 127.0.0.1 (localhost) pero eso me dio el mismo resultado: no pude acceder al sitio web a través de ninguna IP en absoluto.

Busqué en Google este problema y encontré muchas preguntas de StackOverflow pero ninguna me ayudó a resolver mi problema, la mayoría de ellas estaban orientadas a Linux o Mac, por lo que la solución no se aplicaba a mi situación.

Además, puedo ejecutar el código Go en mi computadora y acceder al sitio web desde otro dispositivo en la misma red a través de la IP de mi computadora. No entiendo por qué no puedo acceder a él cuando lo estoy ejecutando en la máquina acoplable, se me ocurrió que puede tener algo que ver con el reenvío de IP o algo, pero soy un novato completo en redes, yo Soy principalmente un desarrollador web y casi no tengo experiencia en nativo.


  1. Abra Oracle VM VirtualBox Manager
  2. Seleccione la VM utilizada por Docker
  3. Haga clic en Configuración -> Red
  4. El adaptador 1 debería (¿predeterminado?) Estar "conectado a: NAT"
  5. Haga clic en Avanzado -> Reenvío de puertos
  6. Agregar regla: Protocolo TCP, Puerto de host 8080, Puerto de invitado 8080 (deje la IP del host y la IP del invitado en blanco)
  7. Invitado es su contenedor acoplable y Host es su máquina

Ahora debería poder navegar a su contenedor a través de localhost: 8080 y your-internal-ip: 8080.


Descubrí que, junto con la configuración de los valores de puerto -p, Docker para Windows usa vpnkit y el tráfico entrante estaba deshabilitado de manera predeterminada en el firewall de mi máquina host. Después de habilitar las reglas TCP entrantes para vpnkit pude acceder a mis contenedores desde otras máquinas en la red local.


Después de probar varias cosas, esto funcionó para mí:

  • use --publish = 0.0.0.0: 8080: 8080 bandera acoplable
  • configure el modo de red de virtualbox en NAT y no use ningún reenvío de puertos

Con direcciones diferentes a 0.0.0.0 no tuve éxito.


Este es el problema más común que enfrentan los usuarios de Windows para ejecutar Docker Containers. OMI, esta es la "pregunta del millón en Docker"; @ "Rocco Smit" ha señalado correctamente "el tráfico entrante porque estaba deshabilitado de manera predeterminada en el firewall de mi máquina host"; en mi caso, mi software McAfee Anti Virus. Agregué puertos adicionales para permitir el tráfico entrante de otras computadoras en la misma LAN Wifi en la Configuración de firewall de McAfee; entonces fue mágico. Había luchado durante más de una semana navegando por Internet, SO, documentaciones de Docker, tutoriales después de tutoriales relacionados con la conexión en red de Docker y las muchas ilustraciones de "no compatible en Windows" para "macvlan", "ipvlan", "usuario puente definido "e incluso este mismo hilo SO un par de veces. Incluso comencé a navegar en google con "¿alguien que usa Docker en producción?" (Sí, sé que Linux es más popular para las cargas de trabajo de Prod en comparación con los servidores de Windows) ya que no pude acceder (desde mi móvil en el mismo wifi doméstico) a nginx aplicación implementada en Docker Container en Windows. Después de todo, de qué sirve, si no puede acceder a la aplicación (implementada en un Contenedor Docker) desde otras computadoras / dispositivos en la misma LAN al menos; En última instancia, en mi caso, el problema era solo con un firewall que bloqueaba el tráfico entrante;


TL; DR Verifique el modo de red de su host VirtualBox: debe conectarse si desea que la máquina virtual (y el contenedor Docker que aloja) esté accesible en su red local.

Parece que su confusión radica en a qué host conectarse para acceder a su aplicación a través de HTTP. Realmente no ha explicado cuál es su configuración: voy a hacer algunas conjeturas, en función del hecho de que tiene "Windows" y "VirtualBox" en sus etiquetas.

Supongo que tienes Docker ejecutándose en una versión de Linux que se ejecuta en VirtualBox en un host de Windows. Voy a etiquetar las direcciones IP de la siguiente manera:

D = la dirección IP del contenedor Docker

L = la dirección IP del host Linux que se ejecuta en VirtualBox

W = la dirección IP del host de Windows

Cuando ejecuta su aplicación Go en su host de Windows, puede conectarse a ella con http://W:8080/ desde cualquier lugar de su red local. Esto funciona porque la aplicación Go vincula el puerto 8080 en la máquina con Windows y cualquier persona que intente acceder al puerto 8080 en la dirección IP W se conectará.

Y aquí es donde se vuelve más complicado:

VirtualBox, cuando configura una máquina virtual (VM), puede configurar la red en uno de varios modos diferentes. No recuerdo cuáles son todas las diferentes opciones, pero la que quieres está bridged . En este modo, VirtualBox conecta la máquina virtual a su red local como si fuera una máquina independiente en la red, al igual que cualquier otra máquina que se conectó a su red. En modo bridged , la máquina virtual aparece en su red como cualquier otra máquina. Otros modos configuran las cosas de manera diferente y la máquina no será visible en su red.

Por lo tanto, suponiendo que configure correctamente la red para el host Linux ( bridged ), el host Linux tendrá una dirección IP en su red local (algo así como 192.168.0.x) y podrá acceder a su contenedor Docker en http://L:8080/ .

Si el host de Linux está configurado en algún modo que no sea bridged , es posible que pueda acceder desde el host de Windows, pero esto dependerá exactamente de qué modo esté.

EDITAR : según los comentarios a continuación, parece que la situación que describí anteriormente es correcta.

Retrocedamos un poco: así es como funciona Docker en mi computadora (Ubuntu Linux).

Imagina que ejecuto el mismo comando que tienes: docker run -p 8080:8080 dockertest . Lo que esto hace es iniciar un nuevo contenedor basado en la imagen dockertest y reenviar (conectar) el puerto 8080 en el host Linux (mi PC) al puerto 8080 en el contenedor. Docker configura su propia red interna (con su propio conjunto de direcciones IP) para permitir que el demonio Docker se comunique y permitir que los contenedores se comuniquen entre sí. Entonces, básicamente, lo que está haciendo con eso -p 8080:8080 es conectar la red interna de Docker con la red "externa", es decir. El adaptador de red del host, en un puerto en particular.

Conmigo hasta ahora? Bien, ahora demos un paso atrás y observemos su sistema. Su máquina está ejecutando Windows: Docker no (actualmente) se ejecuta en Windows, por lo que la herramienta que está utilizando ha configurado un host Linux en una máquina virtual VirtualBox. Cuando docker run la docker run en su entorno, sucede exactamente lo mismo: el puerto 8080 en el host Linux está conectado al puerto 8080 en el contenedor. La gran diferencia aquí es que su host de Windows no es el host de Linux en el que se ejecuta el contenedor, por lo que hay otra capa aquí y es la comunicación a través de esta capa donde tiene problemas.

Lo que necesitas es una de dos cosas:

  1. para conectar el puerto 8080 en la VM VirtualBox al puerto 8080 en el host de Windows, al igual que conecta el contenedor Docker al puerto del host.

  2. para conectar la VM VirtualBox directamente a su red local con el modo de red bridged que describí anteriormente.

Si elige la primera opción, podrá acceder al contenedor en http://W:8080 donde W es la dirección IP o el nombre de host del host de Windows. Si opta por el segundo, podrá acceder al contenedor en http://L:8080 donde L es la dirección IP o el nombre de host de la máquina virtual Linux.

Esa es toda la explicación de nivel superior: ahora debe descubrir cómo cambiar la configuración de la VM VirtualBox. Y aquí es donde realmente no puedo ayudarte: no sé qué herramienta estás usando para hacer todo esto en tu máquina Windows y no estoy familiarizado con el uso de Docker en Windows.

Si puede acceder a la ventana de configuración de VirtualBox, puede realizar los cambios que se describen a continuación. También hay un cliente de línea de comandos que modificará las máquinas virtuales, pero no estoy familiarizado con eso.

Para el modo bridged (y esta es realmente la opción más simple), apague su VM, haga clic en el botón "Configuración" en la parte superior y cambie el modo de red a bridged , luego reinicie la VM y listo. La VM debe recoger una dirección IP en su red local a través de DHCP y debe ser visible para otras computadoras en la red en esa dirección IP.


TLDR: si tiene habilitado el Firewall de Windows, asegúrese de que haya una excepción para "vpnkit" en redes privadas.

Para mi caso particular, descubrí que el Firewall de Windows estaba bloqueando mi conexión cuando intenté visitar el puerto publicado de mi contenedor desde otra máquina en mi red local, porque deshabilitarlo hizo que todo funcionara.

Sin embargo, no quería deshabilitar el firewall por completo solo para poder acceder al servicio de mi contenedor. Esto planteó la pregunta de qué "aplicación" estaba escuchando en nombre del servicio de mi contenedor. Después de encontrar otro hilo SO que me enseñó a usar netstat -a -b para descubrir las aplicaciones detrás de los enchufes de escucha en mi máquina, aprendí que era vpnkit.exe , que ya tenía una entrada en la configuración de mi Firewall de Windows: pero "privado redes "estaba deshabilitado, y una vez que lo habilité, pude visitar el servicio de mi contenedor desde otra máquina sin tener que deshabilitar completamente el firewall.