我应该在两个容器中复制index.php吗?

我正在build立一个小型的Web项目,用于研究两个docker集装箱(一个nginx容器和一个php容器)。

我已经链接了我的容器,现在我可以直接从nginx容器请求这两个静态文件(.js,.css …),并通过套接字向php容器请求/index.php

但到目前为止,我无法处理/请求。

我依靠这个例子来build立我的nginxconfiguration。 下面的代码示例和解释引起了我的注意:

 location / { index index.html index.php; } [...] location ~ \.php$ { fastcgi_pass localhost:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } 

[请求“/”]仅由前缀位置“/”匹配,因此由该位置处理。 然后索引指令testing[index.php]的存在。 如果该指令存在,那么该指令将内部redirect到“/index.php”,并且nginx再次search位置,就好像该请求是由客户端发送的一样。

由于我使用的是Docker容器,所以nginx进程和php工作在两个不同的文件系统中。 所以index.php文件在php容器中,而不是在nginx 。 因此nginx不会find这个文件并返回一个404错误。

这是否意味着我应该 – 即使听起来很脏 – 在两个容器中复制两次php源代码? 还是有更好的方法来解决这个问题? 将301返回到/index.php是正确的方式?

您需要使用docker 持久存储 ,也就是卷。

将项目文件移动到它,当容器启动时,您需要将项目文件映射到每个泊坞窗容器。 (Docker将通过符号链接来完成)

然后,你的nginx容器将路由到php容器使用项目文件和所有将正常工作的地方。

在这个答案中可以find有关docker持久性存储的详细信息: 如何处理docker中的持久性存储(例如数据库)

另外,我的build议是使用docker-compose工具。 pipe理几个容器和卷是非常容易的。 这是使用YAML格式configuration,例如卷设置将如下所示:

 volumes: # Just specify a path and let the Engine create a volume - /var/lib/mysql # Specify an absolute path mapping - /opt/data:/var/lib/mysql # Path on the host, relative to the Compose file - ./cache:/tmp/cache # User-relative path - ~/configs:/etc/configs/:ro # Named volume - datavolume:/var/lib/mysql 

我的build议是使用phpdocker.io生成随时可用的YAML,这将帮助您了解如何build立一个良好的docker生态系统并快速移动。

nginx实际上并没有对这个文件做任何事情。 它基本上来到这个文件,意识到它需要通过php-fpm运行,在这一点上,它要求它“嘿,FPM,在这个位置优先这个文件,并返回输出”

因此, index.php需要存在于fpm和nginx完全相同的位置,因为nginx在获取fpm之前检查文件是否存在。

也就是说,index.php的内容与nginx无关。 当我为给定的应用程序构build容器时,我只需touch /path/to/index.php nginx容器上的touch /path/to/index.php ,并复制nginx实际提供的资源。 你不需要任何你的PHP代码。

在phpdocker.io上,我们将整个项目安装在nginx和fpm上的相同位置,因为这是一个非常简单的方法来满足这两个需求(前端控制器在同一位置,静态资产可用),但这并不是必须的你应该避免在实际执行你的docker构build的时候,因为它会让你的nginx容器没有很好的理由。