Docker在制作中的新功能我有一个设计问题。 使用Docker部署PHP应用程序的最佳方法是什么,该应用程序包含主应用程序目录中必须通过构建进行更新的其他容器使用的数据和信息?
示例(简化Symfony类应用程序):
- application
- app
- src
- vendor
- conf
- conf/vhost.conf
- web/assets/*
让我们只用2个服务进行简化
- php-fpm
- nginx
1 /第一次尝试是建立2张图像
ADD。的/ var / www / html等/项目/
VOLUME / var / www / html / project /
供应商(作曲家)安装在Dockerfile
中
这样我就可以在nginx上找到/ var / www / html / project /
volumes_from php-fpm
=>然后是配置和资产等。
但如果我没有错,那不是一个好方法,因为在下一次构建时我的图像不会更新VOLUME / 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上使用volumes_from:php-fpm。
这很重要,因为我想:
- the conf/vhost.conf
- the assets
- maybe other stuff
我可能需要添加一个SolR,它将使用一些配置文件和/或资源等。
3 /我认为还有另一种方法可以在每张图片上专门添加我需要的内容。我认为它增加了构建过程的复杂性 但它也很有道理。
那么,你觉得怎么样,我错过了什么?接近2 /或3 /,4?
非常感谢!
答案 0 :(得分:1)
您的问题实际上是关于静态文件资产。一些框架和项目非常像它们自己的组件。在php世界中,php-fpm应用程序服务器通常不处理静态文件。它留下了像nginx这样的网络服务器组件。这本身就不是问题。事实上,这是一种很好的做法。
它出现的唯一原因是你在php-fpm和nginx之间引入了一个隔离层。
如果我们考虑另一个非docker,在php-fpm和nginx之间引入隔离的情况,我们会遇到同样的问题。在这个例子中,我将在我的数据中心的DMZ中运行我的nginx服务器,并且php-fpm将充当我的数据中心防火墙后面的应用程序服务器。那个nginx将如何提供php项目的静态文件?
我提到静态资产几乎可以被视为自己的组件。在这个双节点示例中,可以使用部署期间的单独步骤来填充DMZ中nginx服务器上的静态文件。这与您的解决方案#2没有什么不同,您可以运行rsync来填充php-fpm和nginx容器都可以访问的卷。
另一种解决方案是让php-fpm处理这些静态资产。当然,这不是最佳实践,因为php-fpm不是为静态文件提供服务而构建的。它可以完成,但它的优化很差。使用nginx文件缓存可以减轻这种性能损失。
你的#3解决方案也非常可行。您还可以让项目构建两个图像而不是一个。第一个将是您的正常PHP图像,其中包含所有PHP代码。第二个是基于nginx基础映像,而ADD只是项目所需的静态文件。
虽然它不被认为是最佳实践,但在某些项目中,在同一容器中同时运行nginx和php-fpm可能是合适的。如果您的nginx配置实际上只提供静态文件并反向代理到php-fpm,那么您可以将该对进程视为一个逻辑服务。您需要运行supervisord,runit或类似的流程管理器。