La mosca salvaje en el contenedor Docker no se inicia

10

Estoy tratando de acceder a la página de bienvenida de Wildfly que se ejecuta en un contenedor Docker en Windows 10 Pro. Esto es lo que hice:

Sacó la imagen:

docker pull jboss/wildfly

Ejecute el contenedor Wildfly (esto funciona bien, en el registro de Wildfly puedo ver que comenzó correctamente):

docker run -it -p 8080:8080 jboss/wildfly

Encuentra la ID del contenedor:

docker ps

Inspeccione la dirección IP:

docker inspect -f "{{ .NetworkSettings.IPAddress }}" cac63ed21d78

La dirección IP es 172.17.0.2, en un navegador voy a http://172.17.0.2:8080/ pero el navegador se cuelga y se agota el tiempo de espera. ¿Qué me estoy perdiendo?

ACTUALIZAR

También probé con 127.0.0.1:8080y tampoco funciona

ACTUALIZACIÓN2

Registro de consola:

docker --version

#Docker version 19.03.1, build 74b1e89e8a

docker run hello-world

#Hello from Docker!

docker run --detach --publish 8080:80 --name webserver nginx

#Unable to find image 'nginx:latest' locally
#latest: Pulling from library/nginx
#8ec398bc0356: Pull complete
#465560073b6f: Pull complete
#f473f9fd0a8c: Pull complete
#Digest:  sha256:b2d89d0a210398b4d1120b3e3a7672c16a4ba09c2c4a0395f18b9f7999b768f2
#Status: Downloaded newer image for nginx:latest
#c5cdb6de11240b5fe33bc424779721e1b44948797fd6ff389004d0766b71dd17

docker ps

#CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c5cdb6de1124 
#nginx "nginx -g 'daemon of" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp webserver
ps0604
fuente
Vea la respuesta stackoverflow.com/a/43762751/7873775 y pruebe 10.0.75.1:8080 y 10.0.75.2:8080.
Evgeniy Khyst
Lo siento, pero esto no funcionó. Tengo la ventana acoplable y el navegador ejecutándose en la misma máquina con Windows 10. ¿No es 10.0.75.xuna dirección externa y el navegador intenta encontrarla en la web?
ps0604
1
OK, intentemos encontrar el problema. Publique los resultados de los siguientes comandos de la CLI: 1. docker --version, 2. docker run hello-world, 3. docker run --detach --publish 8080:80 --name webserver nginx, 4. luego intente abrir localhost: 8080
Evgeniy Khyst
Consulte la pregunta actualizada con el registro de la consola. Lo intenté localhost:8080y se acabó el tiempo. docker psespectáculosCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c5cdb6de1124 nginx "nginx -g 'daemon of" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp webserver
ps0604
@Evgeniy Khyst Encontré este artículo que habla sobre las redes de Docker. Dice que el servidor que se ejecuta dentro del contenedor tiene que escuchar todas las interfaces (la última parte del artículo), ¿se aplica esto?
ps0604

Respuestas:

3

De manera predeterminada, cuando crea un contenedor, no publica ninguno de sus puertos en el mundo exterior. La red 172.17.XX es interna. Si necesita vincular la dirección IP al host ip run docker container con el indicador -p, así:

-p 8080: 8080

Asigne el puerto TCP 8080 en el contenedor al puerto 8080 en el host Docker

Ivan Vovk
fuente
¿Por qué funciona este ejemplo si los puertos no se publican en el mundo exterior?
ps0604
@ ¿Ha editado incorrectamente la respuesta? Si le echas un vistazo a la pregunta, es exactamente lo que estaba haciendo.
ps0604
@ ps0604 parece que hay un problema de red. En las reglas del cortafuegos de verificación caso
Ivan Vovk
¿Entonces tu respuesta fue incorrecta?
ps0604
Mi respuesta es correcta, porque se basa en la recomendación de la documentación.
Ivan Vovk
3

De: https://docs.docker.com/docker-for-windows/networking/

El reenvío de puertos funciona para localhost; --publish, -p o -P todos funcionan. Los puertos expuestos desde Linux se reenvían al host.

Por lo tanto, debe ser accesible desde http: // localhost: 8080


Si eso no funciona, prueba el ejemplo de Windows

docker run -d -p 80:80 --name webserver nginx

Que debería ser accesible http: // localhost: 80

https://docs.docker.com/docker-for-windows/index#explore-the-application-and-run-examples


Si incluso eso falla, intente:

docker-machine ip default

Y use http: // [docker-machine-ip]: 80

Tyhal
fuente
1
no funciona en localhost: 8080, lo siento
ps0604
¿Podría probar el ejemplo que publiqué anteriormente para ver si es un problema con jboss / wildfly o si es su red de Windows?
Tyhal
Y si nginx no funciona, puede ejecutar 'docker-machine ip default' e intentar usar la IP allí en lugar de localhost
Tyhal
0

La información clave es Docker container in Windows 10 Pro: esta es una especificación muy genérica de cómo funciona su Docker en Windows. Puede haber muchas opciones, por ejemplo, Docker for Windowscon / sin Linux containers, Docker toolboxinstancia remota, ...

En general, los contenedores Docker en Windows se ejecutan en algún tipo de máquina virtual (Hyper-V, Virtualbox, ...), por lo general. Por lo tanto, hay una capa de red adicional, que puede no ser accesible directamente desde su espacio de nombre de red de Windows. Pero el ejemplo vinculado se ejecuta en una máquina Linux, donde esta capa de red adicional no existe. Y esa es una razón por la cual el ejemplo de Linux copiado / pegado no funciona en Windows. Entonces ejecute el contenedor como de costumbre y exponga el puerto 8080:

docker run -it -p 8080:8080 jboss/wildfly

Pero la IP para el acceso será diferente y la IP del contenedor no se puede usar, porque es muy probable que Windows no pueda acceder a esa red interna de acopladores. En su lugar, intente utilizar la IP de su sistema operativo Windows. Eventualmente verifique la documentación de la Docker on Windowssolución usada y encuentre qué IP se usa para los puertos expuestos.

Si tiene habilidades avanzadas de red de Windows / Linux, entonces de alguna manera puede enrutar / reenviar el puerto desde el espacio de nombres de la red de contenedores, a través de la capa de red VM intermedia a la capa de red de Windows. Pero puede ser bastante complicado.

Jan Garaj
fuente
Jan, instalé Docker Desktop para Windows , descargué la imagen y ejecuté el contenedor Wildfly como se explica en el tutorial anterior. En la consola veo que comienza bien, y 8080:8080es lo que en teoría debería funcionar, pero no es así. No sé sobre redes, ¿dónde debería comenzar a buscar?
ps0604
@ ps0604 Si desea seguir el tutorial de Linux a ciegas, use Linux. Como mencioné, doc es tu amigo: docs.docker.com/docker-for-windows/networking se menciona explícitamente There is no docker0 bridge on Windows: Because of the way networking is implemented in Docker Desktop for Windows, you cannot see a docker0 interface on the host. This interface is actually within the virtual machine.. Por favor lidie con esa limitación.
Jan Garaj
0

Tuve un compañero trabajando en un sistema de Windows que enfrentaba el mismo problema. Se esforzó mucho y no pudo llegar a ninguna parte. Parece que hay muchas cosas raras que suceden con Docker Desktop para Windows. Finalmente, acabamos de instalar el subsistema de Linux para Windows e instalamos Docker allí y desde entonces funcionó como un encanto para él. Si desea apegarse a Windows y no le importa trabajar en el subsistema de Linux, le sugiero que siga esa ruta. Fuimos más allá de lo que sugirió Jan Garaj y descubrimos que era una pérdida de tiempo. Docker Desktop para Windows está destinado a ser un entorno en el que trabajas completamente dentro de él, usando contenedores de desarrollo, etc.

Sam Thomas
fuente
Sí, estoy de acuerdo, crearé los contenedores en Ubuntu en lugar de Windows, no tengo problemas allí. Lo único es que desarrollo en Windows, por lo que tendría que probar tres veces, una en Windows durante el desarrollo, luego en el contenedor de Linux y, finalmente, cuando cargue el contenedor en la nube. Si puedo ejecutar el contenedor en Windows, entonces probaría solo dos veces.
ps0604
por eso sugerí el subsistema de Linux ... en realidad no tienes que cambiar el contexto 3 veces, tal vez 2-2.5 veces;)
Sam Thomas