我有一个设计问题。使用Docker部署PHP应用程序的最佳方法是什么?该应用程序包含主应用程序目录中其他容器使用的数据和信息,这些数据和信息必须在构建过程中进行更新。
示例(简化Symfony类应用程序):
- application
- app
- src
- vendor
- conf
- conf/vhost.conf
- web/assets/*
让我们简化一下,只使用两个服务
- php-fpm
- nginx
第一次尝试是构建2幅图像。
加起来。/var/www/html/project/ 卷/var/www/html/project/ 供应商(Composer)安装在Dockerfile中
这样我就能到达/var/www/html/project/ on nginx
volumes_from php
=>,然后是配置和资产等。
但是,如果我没有错,这不是一个很好的方法,因为在下一个构建中,我的映像不会更新=> /var/www/html/project/ (因为它是卷),那么我的代码就永远不会更新。
[2]后来我做了那件事:
- providing the last code base in the image: COPY . /data/image/app
- creating a named volume: docroot
- mount docroot on php-fpm
- adding a rsync on the entrypoint to sync /data/image/app to docroot:/var/www/html/project ( with the good excludes that I needed)
- doing the vendors(composer) install in the entrypoint
在nginx上仍然使用=> _from:php。
这很重要因为我想:
- the conf/vhost.conf
- the assets
- maybe other stuff
我可能需要添加一个使用一些配置文件和/或资源等的SolR。
[3]我认为还有另一种方法,就是在每幅图像上具体添加我所需要的内容。
我认为它增加了构建过程的复杂性,但它也有很多意义。
你觉得呢,我是不是漏掉了什么?方法2/或3/ 4?
非常感谢!
发布于 2016-11-02 04:38:34
您的问题实际上是关于静态文件资产的。一些框架和项目非常类似于它们自己的组件。在php世界中,php应用服务器通常不处理静态文件。这将由像nginx这样的webserver组件来完成。这本身并不是一个问题。事实上,这是一个很好的实践。
它出现的唯一原因是在php和nginx之间引入了隔离层。
如果我们考虑另一种非对接的情况,即在php和nginx之间引入隔离,我们就会遇到同样的问题。在本例中,我将在数据中心的DMZ中运行nginx服务器,而php将充当数据中心防火墙后面的应用服务器。nginx将如何为php项目的静态文件提供服务?
我提到静态资产几乎可以被认为是它们自己的组件。在这个两个节点的示例中,可以使用部署期间的一个单独步骤来填充DMZ中nginx服务器上的静态文件。这与解决方案2没有什么不同,在解决方案2中,运行rsync来填充php和nginx容器都可以访问的卷。
另一个解决方案是让php处理这些静态资产。当然,这并不是一个最佳实践,因为php不是为静态文件构建的。这是可以做到的,但它的优化很差。使用nginx文件缓存可以减轻这种性能影响。
你的第三种解决方案也是可行的。您还可以让您的项目构建两个映像,而不是一个。第一个是包含所有php代码ADDed的普通php映像。第二个将基于nginx基映像,并且只添加项目所需的静态文件。
虽然它不被认为是最佳实践,但在某些项目中,在同一个容器中同时运行nginx和php可能是合适的。如果您的nginx配置实际上只提供静态文件并向php反向代理,那么您可以将这一对进程视为一个逻辑服务。您需要运行supervisord、runit或类似的流程管理器。
https://stackoverflow.com/questions/40372215
复制相似问题