目前我的 Web 应用程序正在服务器上运行,所有服务(nginx、php 等)都直接安装在主机系统中。现在我想使用 docker 将这些不同的服务分离到特定的容器中。 Nginx 和 php-fpm 工作正常。但是在 Web 应用程序中可以生成 pdf,这是使用 wkhtmltopdf 完成的,并且由于我想遵循单个服务每个容器的模式,我想添加一个额外的容器来容纳 wkhtmltopdf 并处理这个特定的服务。
问题是:我该怎么做?如何从 php-fpm 容器中调用 wkhtmltopdf 二进制文件?
一种解决方案是共享 docker.socket,但这是一个很大的安全漏洞,所以我真的不喜欢它。
那么,还有其他方法可以实现这一目标吗?这种“微服务分离”难道不是 docker 的主要目的/目标之一吗?
谢谢你的帮助!
最佳答案
您不能直接将二进制文件从一个容器调用到另一个容器。 (“文件系统隔离”也是 Docker 的主要目标。)
在这种特殊情况下,您可能会将“生成 PDF”视为您的服务执行的操作,而不是其本身的单独服务,因此将二进制文件作为子进程执行是达到目的的一种手段。这甚至不会引起任何并发症,因为大概是 mkhtmltopdf
不是一个长时间运行的过程,您将在每个请求中启动它一次,并且在子过程运行完成之前不响应。我会在 Dockerfile
中安装或包含它打包您的 PHP 应用程序,并在架构上满足于此。
否则,容器之间的主要通信是通过网络 I/O 进行的,因此您必须将此过程包装在一个简单的网络协议(protocol)中,这可能是您选择的语言/框架中的最小 HTTP 服务。这可能不值得,但这是您如何将此二进制文件转换为“单独的服务”,您将打包并作为单独的容器运行。
关于Docker - 容器间脚本执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51431815/