¿Cómo puedo mantener un contenedor Docker y una aplicación de nodo ejecutándose en EC2?

Me gustaría ejecutar un contenedor docker y una aplicación node.js separada en Amazon EC2 Ubuntu, y mantenerlos funcionando constantemente. Tenía la aplicación de nodo ejecutándose con nohup que funcionaba bien, pero quiero ejecutar tanto la window acoplable como la aplicación de nodo juntas para que ambas funcionen o fallen al mismo time. Además, deberían reiniciarse automáticamente después de una falla. (Cuando ejecuté la window acoplable en la pantalla, falló después de un time). ¿Cuál es una forma simple de lograr esto? Noté herramientas como Supervisor , pero no estaba seguro de qué herramienta era específicamente para este propósito.

Como escribí en el comentario, sería útil tener más información sobre qué es exactamente lo que está tratando de lograr y por qué debe imponer una dependencia circular entre sus processs. Las dependencies circulares se evitan mejor en la mayoría de los contexts. Sospecho que podría haber una solución más simple al problema subyacente que intentas abordar. Te sugiero que reconsideres tu architecture y veas si no puedes lograr un acoplamiento más flexible de los componentes. Eso simplificará en gran medida tus operaciones. Aún así, administrar las dependencies entre los processs es una preocupación lo suficientemente razonable, así que aquí hay una respuesta general a su pregunta.

Upstart es el daemon init pnetworkingeterminado en ubuntu a través de trusty. Es fácil de configurar y puede reiniciar aplicaciones cuando fallan. Para versiones futuras, tanto Debian como Ubuntu se cambiarán a systemd . Tanto upstart como systemd proporcionan mecanismos para gestionar dependencies. La parada de Upstart en detenido parece que hace lo que quieres, aunque nunca he experimentado con él. Systemd le permite especificar ExecStop y FailureActions para un service , uno de los cuales podría usarse para eliminar un service relacionado bajo las circunstancias apropiadas. Systemd podría proporcionar un mecanismo de control más apropiado del que no tengo conocimiento.

Otra forma de administrar las dependencies sería hacer que supervisord administre node.js y su otro process juntos dentro del contenedor. El supervisor no es una buena herramienta para iniciar y detener contenedores, pero es excelente para administrar processs dentro de un contenedor. Con un poco de encoding, puede crear un oyente personalizado que también se ejecutaría dentro del contenedor y le indicaría al supervisor que salga si cualquiera de sus processs finaliza. La ventaja de este enfoque es que puede encapsular de manera portátil sus dependencies dentro del contenedor. Luego puede usar upstart o systemd para iniciar el contenedor y todo lo que tendría que hacer es asegurarse de que el contenedor se reinicie si sale.

Simple, manteniendo todos sus requisitos, no lo sé.

Sin embargo, para una forma robusta y escalable, así es como lo haría.

  1. Configurar un clúster Consul (en realidad no tiene que ser un clúster de server real al inicio)
  2. Configurar el descubrimiento del service (es decir, el cónsul sabe qué services supervisar)
  3. Configure la verificación de estado (es decir, el cónsul verifica el estado de sus services)
  4. Cree una secuencia de commands personalizada que sondee el cónsul para conocer el estado del service cada X segundos (los ganchos llegarán pronto, por lo que la votación será innecesaria en un futuro próximo)
  5. Este script es responsable de ssh-ing y reiniciar ambas aplicaciones (aplicación docker y aplicación node.js)