如何在EC2上保持Docker容器和Node应用程序的运行?

3
我想在亚马逊EC2 Ubuntu上运行一个Docker容器和一个独立的Node.js应用程序,并保持它们一直运行。我已经使用nohup让node应用程序正常运行,但我想同时运行docker和node应用程序,这样它们两个要么一起工作,要么一起失败。它们还应该在故障后自动重启。(当我在screen中运行docker时,它会在一段时间后失败。)有没有简单的方法来实现这个目标? 我注意到了像Supervisor这样的工具,但我不确定哪种工具特别适用于这个目的。

我还没有研究过,但最新版本的Docker有新的重启策略功能,请参阅:http://blog.docker.com/2014/08/announcing-docker-1-2-0/ - Mark O'Connor
你想在 Docker 镜像中运行 Node.js 进程,对吗? - fabrizioM
@fabrizioM,没有单独运行node.js,但它与docker实例通信。 - am-rails
对不起,我还是不明白。你说的“显然它们已经坏了”是什么意思?对谁来说是显然的?如果某个服务无法访问所需的资源,因为其他组件失败了,它应该通知管理员(除非失败的资源是唯一的通知系统)。在强大的系统中,一旦其他组件恢复正常,它也应该能够从上次离开的地方继续工作。既然无论如何,您都计划在故障后重新启动,为什么不能只重新启动失败的组件呢? - Aryeh Leib Taurog
沿着这些线路,有许多方法可以确保在您的进程终止/重新启动时得到通知。Upstart、systemd和supervisord都提供了这样的机制。但是,如果Web服务器无法访问所需的服务,它应该响应用户请求并显示有意义的错误页面,而不是退出。 - Aryeh Leib Taurog
显示剩余2条评论
2个回答

2
正如我在评论中所写的,如果能够提供更多关于您究竟想要实现什么以及为什么必须强制实施进程之间的循环依赖的信息,那将会有所帮助。在大多数情况下,最好避免使用循环依赖。我怀疑您正在尝试解决潜在问题的更简单解决方案。建议您重新思考架构,并查看是否可以实现组件之间更松散的耦合,这将大大简化您的操作。尽管如此,管理进程之间的依赖关系是一个合理的关注点,因此以下是对您问题的一般回答。

Upstart 是 Ubuntu 通过 Trusty 的默认 init 守护程序。它易于配置并可以在应用程序失败时重新启动它们。对于未来的版本,Debian 和 Ubuntu 都将切换到 systemd。Upstart 和 systemd 都提供了管理依赖关系的机制。Upstart 的 stop on stopped 看起来就像是你想要的,尽管我自己从未尝试过。Systemd 允许您为 a service 指定 ExecStopFailureActions,其中之一可以用于在适当情况下终止相关服务。Systemd 可能提供了我不知道的更合适的控制机制。

另一种管理依赖的方法是让Supervisord在容器内同时管理Node.js和其他进程。Supervisord不是一个好的启动和停止容器的工具,但它非常适合管理容器内的进程。通过一些编码,你可以创建一个自定义的监听器,它也将在容器内运行,并且会指示Supervisord在任何一个进程终止时退出。这种方法的优点是你可以在容器内封装移植性的依赖关系。然后,你可以使用upstart或systemd来启动容器,如果容器退出,你只需要确保重新启动容器即可。
更新: Docker现在可以为您重新启动进程了,但在这种情况下最好的方法可能是将Node应用程序在单独的Docker容器中运行,并使用ECS或Kubernetes同时部署它们。

谢谢,我会尝试Upstart或systemd。 - am-rails
@am-rails 祝你好运。如果你打算接受我的答案,在赏金结束之前这样做会很体贴。 - Aryeh Leib Taurog

-1

简单地满足您的所有要求,我不知道。

但是,如果需要一个强大且可扩展的方式,这里是我的建议:

  1. 设置Consul集群(起初实际上不必是真正的服务器集群)
  2. 配置服务发现(即Consul了解要监视哪些服务)
  3. 配置健康检查(即Consul检查您的服务状态)
  4. 编写自定义脚本,每X秒轮询Consul以获取服务状态(钩子即将推出,因此在不久的将来轮询将变得不必要)
  5. 该脚本负责ssh并重新启动两个应用程序(docker应用程序和node.js应用程序)

谢谢,但我认为我不需要外部服务或应用程序来完成这个。 - am-rails

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接