如何在EC2上运行Docker容器和节点应用程序?

时间:2014-08-27 14:48:52

标签: node.js amazon-ec2 daemon docker

我想在Amazon EC2 Ubuntu上运行一个docker容器和一个单独的node.js应用程序,并让它们不断运行。我使用nohup运行的节点应用程序工作正常,但我想同时运行docker和节点应用程序,以便它们同时工作或失败。此外,他们应该在失败后自动重启。 (当我在屏幕上运行docker时,它会在一段时间后失败。)实现此目的的简单方法是什么?我注意到了诸如Supervisor之类的工具,但我不确定哪种工具专门用于此目的。

2 个答案:

答案 0 :(得分:2)

正如我在评论中所写,有助于获得有关您要完成的内容以及为什么必须在流程之间强制执行循环依赖关系的更多信息。在大多数情况下,最好避免循环依赖。我怀疑你可能想要解决more simple solution to the underlying problem。我建议你重新考虑你的架构,看看你是否无法实现更松散的组件耦合。这将大大简化您的操作。尽管如此,管理进程之间的依赖关系是一个合理的问题,所以这里是对你的问题的一般答案。

Upstart是ubuntu上通过trusty的默认init守护进程。它易于配置,并可在失败时重新启动应用程序。对于将来的版本,debian和ubuntu都将切换到systemd。 upstart和systemd都提供了管理依赖关系的机制。 Upstart的stop on stopped看起来像你想做的,虽然我自己没有尝试过。 Systemd允许您为a service指定ExecStopFailureActions,其中一个可用于在适当的情况下终止相关服务。 Systemd可能会提供一种我不了解的更合适的控制机制。

管理依赖关系的另一种方法是让supervisord在容器内一起管理node.js和你的其他进程。 Supervisor不是启动和停止容器的好工具,但它非常适合管理容器内的进程。通过一些编码,您可以创建一个自定义listener,它也可以在容器内运行,并指示主管在您的任何一个进程终止时退出。这种方法的优点是您可以在容器中可移植地封装依赖项。然后你可以使用upstart或systemd来启动容器,你所要做的就是确保容器在退出时重新启动。

<强>更新 Docker can restart your processes for you now,但在这种情况下,最好的方法可能是在单独的docker容器中运行节点应用程序,并使用ECS或Kubernetes将它们一起部署。

答案 1 :(得分:-1)

在保持所有要求的同时很简单,我不知道。

对于一个强大且可扩展的方式,我在这里是如何做到的。

  1. 设置Consul群集(开始时确实不必是实际的服务器群集)
  2. 配置服务发现(即Consul了解哪些服务 监控)
  3. 配置health支票(即领事检查您的状态 服务)
  4. 制作一个自定义脚本,每隔X轮询一次Consul的服务状态 秒(挂钩即将到来,因此轮询将变得不必要 在不久的将来)
  5. 此脚本负责ssh-ing并重新启动这两个应用程序 (docker app&amp; node.js app)