No se puede conectar con el servidor localhost WSL2 del contenedor WSL2

Estoy ejecutando un servidor web simple en https://0.0.0.0:4000 (accesible también como https://local.phx-cd.shoepping.at:4000 con asignación a 127.0.0.1 en Ubuntu archivo hosts) en mi WSL2 Ubuntu. Puedo conectarme a él desde Ubuntu y Windows host - hasta ahora tan bueno. Pero además, en mi Docker for Win con integración WSL2, ejecuto un contenedor de cromo de selenio que está conectando y probando cosas en ese servidor web (utilizando puente), pero no puede conectarse a él!

Conecté con el contenedor e intenté frenar al servidor web - conexión rechazada. Desde Tengo arranque dual en mi computadora, intenté cambiar a mi distro Linux, ejecutar el servidor web allí y selenio en Linux Docker y la conexión con el servidor web local funcionó. Así que creo que tiene algo que ver con el WSL2.

Mi garabato. Yaml (dejé mi config de centro de selenio)

selenium-chrome-local:
      image: selenium/node-chrome-debug:3.141.59
      restart: always
      ports:
        - 5901-5902:5900
      volumes:
        - /dev/shm:/dev/shm
        - ../../temp:/home/seluser/Downloads
      depends_on:
        - selenium-hub-local
      environment:
        - SCREEN_WIDTH=1920
        - SCREEN_HEIGHT=1080
      extra_hosts:
        - "local.phx-cd.shoepping.at:10.99.99.1"
      networks:
        - selgrid
        - dockerhost

 networks:
    selgrid:
    dockerhost:
      driver: bridge
      ipam:
        config:
          - subnet: 10.99.99.0/24

Avísame si necesitas más config. Gracias.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por byteexplorer


5 Respuestas:

  • ¿Estás seguro de que la instancia Ubuntu WSL2 está en ejecución? Por defecto, las instancias WSL2 ejecutan NAT'd (donde mientras las instancias WSL1 corrían puenteadas). Así que, mientras que sí, la red Docker está puenteada, todavía no puede acceder a la NAT'd WSL2 VM sin un trabajo extra.

    Estoy bastante seguro de que estás corriendo al problema de la raíz descrito en WSL issue #4150. Si es así, aquí hay algunas cosas que probar ...

    Opción #1 - Port forwarding to the WSL2 instance

    Hay varias soluciones de trabajo sugeridas en ese número de GitHub, pero los fundamentos que trabajarían para su caso se reducen al puerto de reenvío 4000 desde la interfaz de host de Windows a la dirección IP privada de la instancia WSL2. En PowerShell:

    netsh interface portproxy delete v4tov4 listenport="4000" # Delete any existing port 4000 forwarding
    $wslIp=(wsl -d Ubuntu -e sh -c "ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1") # Get the private IP of the WSL2 instance
    netsh interface portproxy add v4tov4 listenport="4000" connectaddress="$wslIp" connectport="4000"
    

    Tenga en cuenta que necesitará hacer esto después de cada reinicio, o de lo contrario configurar un script que se ejecuta en logon como se describe en el problema GitHub (ver este comentario).

    Opción #2 - WSL1

    También propongo que suponiendo que se ajuste a su flujo de trabajo y si su aplicación web se ejecuta en él, simplemente puede utilizar WSL1 en lugar de WSL2. Puedes probar esto por:

    1. Respaldo de su distro existente (de PowerShell o cmd, uso wsl --export
    2. Importar la copia de seguridad en una nueva instancia WSL1 con wsl --import --version 1

    Es posible simplemente cambiar las versiones en su lugar, pero me gusta tener una copia de seguridad de todos modos antes de hacerlo, y mientras usted está respaldando, usted también puede dejar el original en su lugar.

    Opción posible #3 - socat reenvío o túnel

    Mientras no he probado su caso de uso particular directamente, he jugado con socat en WSL2 con éxito. De lo que parece socat podría ser utilizado para el reenvío del puerto de WSL2 a (al menos) el host Windows (que sería accesible al contenedor Docker). See este comentario un ejemplo en GitHub sobre un caso de uso similar como el suyo.

    Opción posible #4 - WSL2 en modo puente

    El hilo GitHub mencionado anteriormente también tiene algunos detalles sobre cómo habilitar el modo puente en la interfaz WSL2 utilizando Hyper-V. Creo que esto requiere Windows 10 Professional o Enterprise. También tiene que hacerse después de cada reinicio, como con la opción 1. De nuevo, probablemente sobrematar para este caso, si el reenvío del puerto o WSL1 puede lograr lo que necesita.

    Respondida el Dec 16, 2020 a las 16:34 - por bitwisewizard

    Votos positivos: 0 | Votos negativos: 0

  • Ejecute este comando en PowerShell como Administrador:

    Reemplazamiento {#requiredWindowsPort} con el puerto que se utilizará en el navegador

    Reemplazamiento {#requiredWSL2Port} con el puerto que se ejecuta en WSL2 que desea conectar.

    netsh interface portproxy add v4tov4 listenport={#requiredWindowsPort}
    listenaddress=0.0.0.0 connectport={#requiredWSL2Port}
    connectaddress=$($(wsl hostname -I).Trim());
    

    Respondida el Dec 16, 2020 a las 16:43 - por coderchampion

    Votos positivos: 0 | Votos negativos: 0

  • Solución para mí: Yo edito .wslconfig en el directorio de usuario reemplazando localhostforwarding=false a localhostforwarding=true

    Respondida el Dec 16, 2020 a las 16:53 - por byteninja

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando puede estar relacionado con la forma en que estás intentando acceder al servidor web desde el contenedor de Selenium en Docker. Es posible que el contenedor no esté alcanzando correctamente la dirección IP donde se encuentra el servidor web local debido a la configuración de red de WSL2.

    Una posible solución sería utilizar la dirección IP específica de WSL2 en lugar de usar 0.0.0.0 o 127.0.0.1 para acceder al servidor web desde el contenedor de Docker. Puedes obtener la dirección IP de WSL2 ejecutando el comando ip addr show eth0 en la terminal de WSL2 y utilizando esa dirección en la configuración de tu contenedor de Docker.

    Además, asegúrate de que la red definida en el archivo docker-compose.yml esté permitiendo la comunicación entre el contenedor de Selenium y el servidor web local en WSL2. Puedes revisar la configuración de red de WSL2 para asegurarte de que no esté bloqueando la conexión entre los contenedores.

    Si después de realizar estos cambios aún tienes problemas para conectar el contenedor de Selenium al servidor web local, puedes explorar otras alternativas como utilizar un puerto específico en lugar de 0.0.0.0, verificar las reglas de firewall en WSL2, o buscar guías específicas para la integración de WSL2 con contenedores de Docker.

    Espero que esta información sea de ayuda. ¡Déjame saber si necesitas más asistencia!

    Respondida el Dec 17, 2020 a las 16:36 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Posibles causas y soluciones:

    1. Problemas de red:

    Comprueba la configuración de red: Asegúrate de que el contenedor Docker y el servidor web en WSL estén en la misma red y puedan comunicarse entre sí. Deshabilita el firewall: Intenta deshabilitar temporalmente el firewall en el host de Windows o WSL para ver si eso resuelve el problema. Usa una dirección IP específica: En lugar de usar "localhost", intenta utilizar la dirección IP específica del servidor web al conectarte desde el contenedor Docker.

    2. Problemas de DNS:

    Agrega la entrada DNS: Agrega una entrada DNS al archivo /etc/resolv.conf en el contenedor Docker para mapear el nombre de host del servidor web a su dirección IP. Usa un servidor DNS personalizado: Configura el contenedor Docker para utilizar un servidor DNS personalizado que pueda resolver el nombre de host del servidor web.

    3. Problemas de WSL:

    Actualiza WSL: Asegúrate de tener instaladas las últimas actualizaciones de WSL. Reinstala WSL: Intenta reinstalar WSL y el contenedor Docker para descartar posibles problemas de configuración.

    4. Otros problemas:

    Comprueba los puertos: Asegúrate de que el puerto que está utilizando el servidor web esté abierto y accesible tanto desde el contenedor Docker como desde WSL. Verifica los permisos: Comprueba que el usuario que ejecuta el contenedor Docker tenga los permisos necesarios para acceder al servidor web. Intenta utilizar un servidor proxy: Si todo lo demás falla, intenta utilizar un servidor proxy para conectar el contenedor Docker al servidor web.

    Configuración adicional que puedes probar:

    En el contenedor Docker: Agrega --net=host a los comandos de ejecución para compartir el espacio de red del host con el contenedor. En el archivo docker-compose.yml: Agrega network_mode: host a la sección selenium-chrome-local.

    Nota: No olvides volver a habilitar el firewall después de las pruebas.

    Avísame si alguna de estas soluciones resuelve tu problema.

    Respondida el Dec 17, 2020 a las 16:40 - por Gemini

    Votos positivos: 0 | Votos negativos: 0