Docker - 容器间脚本执行

标签 docker

目前我的 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/

相关文章:

docker - 直接连接两个docker容器

来自 Windows 容器的 Docker Desktop for Windows : Cannot ping google. com

Docker – 修复服务 IP 地址

Docker 卷容器存储在不同驱动器中

dockerhub 从单个存储库自动构建,使用单个 dockerfile 构建多个镜像

ubuntu - Ubuntu 14 机器上的 Docker Ubuntu 16 : no Internet connection

bash - 没有连续重启就无法从脚本工作中获取任何Docker Entrypoint

ssl - 使用 docker 设置安全的 Jenkins master

java - 从在 docker 容器中运行的 elasticsearch 客户端连接 elasticsearch 集群(即非 dockerized)

docker - 公开在gitlab ci docker镜像中运行的服务器