Tengo un contenedor Docker ejecutándose en mi máquina Ubuntu Linux 14.04 que expone un puerto públicamente:
docker run --name spacyapi -d -p 127.0.0.1:7091:7091 jgontrum/spacyapi:enPuedo conectarme y ejecutar comandos contra el servidor en el contenedor sin problema desde la máquina local. Por ejemplo:
curl http://localhost:7091/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POSTEl comando se ejecuta fielmente. Sin embargo, si pruebo el mismo comando CURL desde una máquina externa, obtengo un error de "conexión rechazada":
curl http://192.5.169.50:5000/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POST curl: (7) Failed to connect to 192.5.169.50 port 7091: Connection refusedDonde 192.5.169.50 es la dirección IP del cuadro que ejecuta el contenedor Docker.
No creo que necesite ninguna regla de iptables porque no necesito configurar ninguna para el servidor Node.JS que se ejecuta en la misma caja. Todas las demás computadoras en mi red local pueden acceder al servidor Node.JS sin problemas. Pero no el contenedor Docker que actúa como servidor.
¿Cómo puedo arreglar esto?
No publicaste públicamente tu puerto con esta bandera:
-p 127.0.0.1:7091:7091Ese indicador dice publicar en la interfaz del host 127.0.0.1 (localhost), puerto 7091 al puerto de contenedores 7091. La única forma de llegar a ese puerto es estar en el host y conectarse a la interfaz de bucle invertido.
Para publicar públicamente el puerto, elimine la IP de esa bandera:
-p 7091:7091o publicar explícitamente en todas las interfaces con:
-p 0.0.0.0:7091:7091 El último formato es idéntico al primero, siempre y cuando no haya anulado la configuración del demonio docker con dockerd --ip xxxx o establecido el valor de ip en su archivo /etc/docker/daemon.json.
No creo que la IP del contenedor sea 192.5.169.50. Intente hacer docker inspect <container-uid> | grep IPAddress para verificar cuál es la IP del contenedor. Creo que debería ser algo así como 172.17.0.X.
También podría hacer docker run -d --network=host <image> que apila el contenedor encima de la red host.
Los contenedores son simplemente algo encima del host, el host es el que realmente se comunica con el exterior.