首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Docker部署更新共享卷

Docker部署更新共享卷
EN

Stack Overflow用户
提问于 2016-11-02 03:52:22
回答 1查看 305关注 0票数 1

我有一个设计问题。使用Docker部署PHP应用程序的最佳方法是什么?该应用程序包含主应用程序目录中其他容器使用的数据和信息,这些数据和信息必须在构建过程中进行更新。

示例(简化Symfony类应用程序):

代码语言:javascript
运行
复制
- application
    - app
    - src
    - vendor
    - conf
    - conf/vhost.conf
    - web/assets/*

让我们简化一下,只使用两个服务

代码语言:javascript
运行
复制
- 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]后来我做了那件事:

代码语言:javascript
运行
复制
- 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。

这很重要因为我想:

代码语言:javascript
运行
复制
- the conf/vhost.conf
- the assets
- maybe other stuff

我可能需要添加一个使用一些配置文件和/或资源等的SolR。

[3]我认为还有另一种方法,就是在每幅图像上具体添加我所需要的内容。

我认为它增加了构建过程的复杂性,但它也有很多意义。

你觉得呢,我是不是漏掉了什么?方法2/或3/ 4?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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或类似的流程管理器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40372215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档