HAProxy no ejecuta correctamente la API de nodeJS

Estoy ejecutando coreOS en EC2. Tengo una image de acoplador de API nodeJS y la ejecuto en un par de puertos (25001 y 25002). Cuando me acurruco con ellos, veo una respuesta adecuada.

Mi intención es tener un HAProxy por encima de estos (ejecutar en 25000) que cargará el equilibrio entre estos dos. Así que aquí están los pasos que hice:

DockerFile para HaProxy:

FROM haproxy:1.5 COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg 

haproxy.cfg:

 global # daemon maxconn 256 log /dev/log local0 defaults mode http log global timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend http-in bind *:25000 default_backend node_api backend node_api mode http balance roundrobin server api1 localhost:25001 server api2 localhost:25002 

Resultado: cuando ejecuto Curl para services individuales, trabajan —>

 curl -i localhost:25001/ping HTTP/1.1 200 OK X-Powenetworking-By: Express Access-Control-Allow-Origin: * Content-Type: application/json; charset=utf-8 Content-Length: 68 ETag: W/"44-351401c7" Date: Sat, 06 Jun 2015 17:22:09 GMT Connection: keep-alive {"error":0,"msg":"loc receiver is alive and ready for data capture"} 

Lo mismo funciona para 25002 Pero cuando me ejecuto para 25000, obtengo un error de time de espera como el siguiente:

 curl -i localhost:25000/ping HTTP/1.0 504 Gateway Time-out Cache-Control: no-cache Connection: close Content-Type: text/html <html><body><h1>504 Gateway Time-out</h1> The server didn't respond in time. </body></html> 

Me pregunto qué estoy haciendo mal aquí? Cualquier ayuda sería apreciada …

Cuando le dice a HAProxy que el server de background está ubicado en

 server api1 localhost:25001 

está dando una dirección relativa al contenedor HAProxy . Pero sus serveres de nodo no se están ejecutando en ese contenedor, por lo que no hay nadie en localhost.

Aquí tienes algunas opciones.

  • Puede usar la opción --link para la docker run del acoplador para conectar HAProxy a sus dos back-ends.
  • Puede usar la opción --net=host para la --net=host la --net=host docker run y luego sus serveres pueden encontrarse en localhost
  • Puede proporcionar a HAProxy la dirección de su host como la dirección de back-end

La primera opción es la mayoría del contenedor-y, pero el performance de la networking puenteada de Docker es pobre con altas cargas. La segunda opción es buena siempre y cuando no te importe que estés dejando que todo salga de su contenedor cuando se trata de la networking. El tercero es kludgey pero no tiene los otros dos problemas.

El artículo de Docker sobre networkinges tiene más detalles.