Docker化PHP应用程序架构最佳实践

时间:2015-10-07 14:01:59

标签: php docker

我是Docker的新手。我在开发环境中使用Docker玩了很多,但我尝试只部署一次真正的应用程序。

我已经阅读了大量的文档并观看了视频的打瞌睡,但仍然有很多问题。 我确实理解Docker只是一种可以用于多种不同方式的工具,但现在我正试图找到开发和部署Web应用程序的最佳方法。

我将使用真正的PHP App案例来使我的问题更具体和实用。 为了简单起见,我们假设我正在构建一个非常简单的PHP应用程序,因此我需要:

  1. Web服务器(nginx)
  2. PHP解释器(php-fpm或hhvm)
  3. SESSION的持久存储
  4. 我能找到的最好的示例/教程是this one year old post。迪伦提出了这种结构: Dockerized PHP App

    他对整个PHP项目文件和日志使用仅数据容器,并使用适当的链接docker-compose运行所有这些图像。在开发环境中,我将主机目录作为数据卷安装,对于生产,我将文件直接复制到仅数据映像并进行部署。

    这是可以理解的。我确实希望在nginxphp-fpm之间共享数据。 nginx需要访问静态文件(.img,.css,.js ...),php-fpm需要访问PHP文件。两个服务都是分开的,因此可以独立更新/更改。

    仅限数据的容器与data volume选项的nginxphp-fpm共享--volumes-from

    但据我所知 - 数据集容器和-v标志存在问题。 Official Docker Documentationdata volume是专门指定的目录来保存数据!据说

      

    即使容器本身被删除,数据量仍然存在。

    所以这个解决方案非常适合我不想像会话文件,数据库存储,日志等那样松散的数据。但不是我的代码文件,对吧?我确实想要更改我的代码文件。我想部署更改而不重建nginxphp-fpm图片。

    另一个问题是当我尝试这种方法时,我无法部署代码更改,直到我停止所有正在运行的容器,删除它们和它们的图像并完全重建它们。只是重建和部署Data Only图像什么也没做!

    当数据直接存储在Interpreter容器中时,我已经看到了其他一些实现,但它不是一个选项,因为我还需要nginx来访问这些文件。

    问题是在这种应用程序中放置项目代码文件以及如何部署更改的最佳做法是什么?

    感谢。

1 个答案:

答案 0 :(得分:2)

是的,不要为您的代码使用数据卷。 docker-compose重新使用旧卷(因此您不会丢失数据),因此您始终会遇到旧代码。

使用COPY指令在nginx Dockerfile中添加静态资源,在应用程序中添加COPY(phpfpm)Dockerfile以添加代码。在开发中,您可以使用主机卷,这样您就不必重新启动容器来查看代码更改(假设Web服务器支持获取更改)。