我应该在两个容器中复制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容器没有很好的理由。