【问题标题】:Moving prefork application under docker在 docker 下移动 prefork 应用程序
【发布时间】:2016-12-27 05:13:49
【问题描述】:

我有一个 prefork 模型服务器。这意味着应用程序将启动,绑定一个端口上的套接字,它们分叉 X 次,以便每个子节点共享同一个端口。

我现在想将这个应用程序移植到 docker 下。 我的理解是一个 docker 实例应该只运行我的一个服务器,以获得更好的可用性。因此,如果我想运行我的进程的 5 个实例,我应该运行 5 个 docker 实例,所有这些实例都运行一次我的应用程序。 到目前为止我是正确的吗?

如果是,我的问题是,是否可以让我的所有 docker 实例都在同一个端口下运行?

我同意我可以使用反向代理来为我的服务映射一系列端口,但如果可能的话,我想避免这种情况。

【问题讨论】:

  • 我认为你不能在“纯”Docker 中做到这一点。但是在 Docker 实例中托管这些应用程序并使用 HAProxy 来聚合它们可能是一个好主意。您甚至可以将 hub.docker.com/_/haproxy 与您的实例一起使用来构建 docker 网络。

标签: docker fork preforking


【解决方案1】:

Docker 为您的容器提供进程命名空间,您的进程可以在其中派生子进程或运行多线程。您可以轻松地在 docker 容器内运行多进程应用程序,事实上,这就是您在运行 bash shell 然后在 bash 内运行任何其他 cli 命令时所做的事情。

唯一的要求是您使用docker run 启动的进程在Linux 系统上作为pid 1 承担init 的角色。这意味着如果您的pid 1 退出,整个容器会立即终止。所以你的主进程需要保持在前台运行。

另外,如果任何进程在退出时没有被父进程收割并且它们进入僵尸状态,它们将不会被主机操作系统的 init 自动清除(僵尸进程不会传播到命名空间之外。为了解决这个问题,有像 tini 这样的项目在容器内充当 init 替代品。

【讨论】:

  • 谢谢,但是如果我想运行我的应用程序的 5 个实例,在 5 个不同的 docker 中单独运行它们比在同一个 docker 中运行不是更好吗?
  • 这因情况而异,但我不相信你所描述的情况。
  • 谢谢,你能解释一下不同的情况吗?
  • 在一个共享端口上运行多个工作程序侦听与在同一个容器中同时运行 Web 服务器和数据库或 ldap 服务器或邮件服务器有很大不同。
猜你喜欢
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 2014-10-25
相关资源
最近更新 更多