集装箱模式的最佳实践

时间:2016-10-16 21:20:10

标签: python nginx docker uwsgi supervisord

我使用https://hub.docker.com/r/tiangolo/uwsgi-nginx图像对Python webapp进行了码头化,该图像使用管理程序来控制uWSGI实例。

我的应用程序实际上需要一个额外的管理程序介导的进程(LibreOffice无头,我通过appy模块生成文档),我想知道实现它的正确模式是什么。

我看到它的方式,我可以使用额外的supervisor配置扩展上面的图像以满足我的需求(以及所有必要的操作系统级安装步骤),但这与运行最少的一般原则相矛盾给定容器中不同进程的数量。但是,由于我的Python应用程序只能在本地与LibreOffice通信,我不确定如何通过更容器化的方法实现它。感谢您提供任何帮助或建议。

2 个答案:

答案 0 :(得分:2)

对于每个容器一个进程的建议是合理的 - Docker只监视它在容器运行时启动的进程,因此如果你有多个进程,Docker就不会监视它们。它也是一个更好的设计 - 你有轻量级,专注的容器,只有一个职责,你可以独立管理它们。

user2105103是正确的,你正在使用的图像已经失去了这个好处,因为它运行Python和Nginx,你可以使用LibreOffice无头扩展它并打包你的整个应用程序而无需更改代码。

如果您采用更“最佳实践”的方法,您将在Docker网络中的三个容器中运行分布式应用程序:

  • nginx - 网络代理,这是该应用的公共入口点。 Nginx可以进行路由,缓存,SSL终止,速率限制等。
  • app - 您的Python应用程序,仅在Docker网络中可见。接收来自nginx的请求,并使用libreoffice进行文档操作;
  • libreoffice - 在无头模式下运行API,但只能在Docker网络中使用。

您需要更改代码,引入类似PyOO的内容,以便从应用容器中远程使用LibreOffice API。

答案 1 :(得分:1)

你已经吹过“每个容器一个进程” - 只需添加另一个进程。这不是一个硬规则,甚至不是每个人都同意的规则。

扩展,或者更好地创建自己的自定义容器。这样你拥有它,你理解它,并且它是为你的目的而优化的。