【问题标题】:How can I have nginx in one container and php-fpm in another?如何在一个容器中拥有 nginx,而在另一个容器中拥有 php-fpm?
【发布时间】:2016-08-26 19:38:30
【问题描述】:

我正在尝试创建两个 docker 容器。一个包含 nginx,另一个包含 php-fpm。这是我的docker-compose.yml

version: '2'
services:
  nginx:
    build: ./nginx
    ports:
      - "80:80"
      - "443:443"
  fpm:
    build: ./php
    volumes:
      - ./php/code:/var/www/html/

NGINX

这是我的Dockerfile nginx 容器:

FROM nginx:latest RUN rm /etc/nginx/conf.d/default.conf COPY ./default.conf /etc/nginx/conf.d/

还有,这是我的default.conf

server {
    listen  80;

    server_name localhost;
    root /var/www/html;

    error_log /var/log/nginx/localhost.error.log;
    access_log /var/log/nginx/localhost.access.log;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /app.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        fastcgi_pass fpm:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

这是我所有的 nginx 配置。

PHP

这是./php目录中的Dockerfile

from php:fpm
COPY ./code/ /var/www/html/

./code 目录中,我有一个名为app.php 的文件,其中包含phpinfo()

问题

我运行docker-compose up,当我尝试打开192.168.99.100(运行docker引擎的docker机器的IP)时,我得到File not found。我也试过192.168.99.100/app.php,但还是一样。

我配置错了什么?我在 Internet 上的一个示例中看到 PHP 文件必须存在于 nginx 容器中,但这没有任何意义,因为据我所知,php-fpm 是必须有权访问这些文件的进程。

【问题讨论】:

    标签: php nginx docker


    【解决方案1】:

    您的 404 错误的原因是您的 Nginx 容器中没有文件。

    您必须将链接到 PHP-FPM 容器中的相同文件链接到 Nginx 容器中:

    version: '2'
    services:
      nginx:
        build: ./nginx
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./php/code:/var/www/html/
    
      fpm:
        build: ./php
        volumes:
          - ./php/code:/var/www/html/
    

    当请求到达网络服务器时,文件必须至少存在,然后 Nginx 才能将请求传递给 PHP-FPM 容器。你甚至可以将 Nginx 容器的文件夹设为只读:

    version: '2'
    services:
      nginx:
        build: ./nginx
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./php/code:/var/www/html/:ro
    
      fpm:
        build: ./php
        volumes:
          - ./php/code:/var/www/html/
    

    【讨论】:

    • 啊。那么有没有办法在 nginx 容器中没有文件呢?我问是因为在我的 nginx Dockerfile 中,无论如何我都必须将文件复制到图像中(用于生产),我想知道是否有办法不增加图像大小。或者,将整个东西放在一个容器中是否更明智?我正在尝试遵循 Docker 最佳实践,它说:“在几乎所有情况下,您应该只在单个容器中运行单个进程。将应用程序解耦到多个容器中可以更容易地水平扩展和重用容器。”跨度>
    • 根据我的经验,我会使用卷并将文件链接到容器中,并且永远不会将两个应用程序放入同一个容器中。在我看来,容器是应用程序代码的执行单元,我不会编译包含代码和应用程​​序的 docker 映像。如果您仍想将应用程序代码放入 docker 镜像中,我将构建一个仅包含应用程序代码的 docker 镜像,并将其用作 Nginx 和 PHP 的源代码。
    • 谢谢!我更新了我的docker-compose.yml 文件并添加了新卷。但是,我仍然遇到同样的错误。
    • 对不起。它不起作用的原因是因为我需要通过键入docker-compose build 来强制构建图像。
    【解决方案2】:

    按照其他答案中的建议并在此问题上花费大约六个小时或更长时间后,我发现我的设置不起作用的原因是因为docker-compose up 没有重建您的图像,所以配置容器中是旧版本。

    所以,解决这个问题就像docker-compose build 然后docker-compose up 一样简单。

    很抱歉占用大家的时间。

    【讨论】:

    • docker-compose up --build 将在启动容器之前重建您的图像。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 2022-01-22
    • 2017-05-28
    相关资源
    最近更新 更多