Saqué una imagen de Docker:
$ docker pull ghost
Y ejecuta un contenedor desde la imagen:
$ docker run --name test-ghost -p 8080:2368 -d ghost
7d984e974f6a75fe18b3d397b5c8f0a428928a2be9df83f0d61a679aa5f537fc
Tengo entendido que el -p
conmutador asignará un puerto en el host (8080) a un puerto dentro de Docker (2368), de modo que pueda acceder al servidor web que se ejecuta dentro de Docker, desde fuera de Docker, es decir, desde mi host.
Sin embargo, cuando intento navegar a cualquiera de las siguientes direcciones en Chrome, desde mi host:
http://localhost:8080/
http://0.0.0.0:8080/
http://127.0.0.1:8080/
Obtuve el siguiente error:
This webpage is not available
ERR_CONNECTION_REFUSED
Parece que podría ser un problema de conectividad, en lugar de un problema dentro del contenedor, ya que cuando inspecciono los procesos en ejecución dentro del contenedor, parece que NodeJS se está ejecutando:
$ docker top test-ghost
UID PID PPID ... CMD
docker 4290 1028 ... npm
docker 4324 4290 ... sh -c node index
docker 4325 4324 ... node index
Pero parece que no hay nada escuchando en el puerto 8080:
$ sudo lsof -n -i4TCP:8080 | grep LISTEN
$
También lo verifiqué y mi firewall de MacOS está desactivado.
No espero una solución completa aquí, ya que soy consciente de que la información que he proporcionado es mínima.
Lo que me pregunto es, ¿cómo se podría solucionar ese problema?
Parece que no se puede acceder al puerto Docker.
¿Hay alguna forma de averiguar por qué no funcionó la asignación de puertos? O que puertosson¿Está siendo expuesto por Docker? ¿Quizás estoy asignando el puerto interno incorrecto?
¿O hay alguna otra sugerencia general sobre lo que podría estar haciendo mal aquí?
Respuesta1
¡Finalmente descubrí cómo hacer que esto funcione!
Estoy ejecutando Docker en MacOS y usando 'Docker QuickStart Terminal'.
Resulta que navegar a 'localhost', '127.0.0.1', etc. fue incorrecto, porque parece que Docker configura su propio host:
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com
Cuando uso 192.168.99.100
, como se indicó anteriormente, todo funciona bien.
Respuesta2
Para averiguar la dirección IP del contenedor en ejecución, puede utilizar:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myContainerID
Respuesta3
Si ejecuta Docker con docker-machine
use el siguiente comando para obtener la dirección IP (suponiendo que default
sea su nombre):
docker-machine ip default
Respuesta4
Comencé a jugar con Docker y este es el primer problema que encontré.
Parece que la ventana acoplable le permite especificar si está utilizando puertos en diferentes modos, como host, puente (predeterminado)
En el modo puente, la ventana acoplable le muestra un mensaje una vez que implementa Ghost: su blog ahora está disponible enhttp://localhost:2368/pero al visitar esta URL se muestra que la conexión fue rechazada.
Para solucionar este problema, debes visitar la configuración de la instancia en kitematic (es más fácil que usar la consola). Vaya a la pestaña nombre de host/puertos. Cree una asignación como se muestra en la imagen desde el puerto acoplable hasta el puerto host y bingo. Ahora visite la URL nuevamente y todo funciona como se esperaba.