【问题标题】:PHP Development Environment using Docker使用 Docker 的 PHP 开发环境
【发布时间】:2017-05-10 22:40:00
【问题描述】:

我目前正在尝试使用 NGINX 和 PHP-FPM Docker 容器设置 PHP 开发环境。

现在我知道,这可以通过运行两个服务的单个容器来实现,甚至可以通过多个容器设置来实现,其中每个服务都在自己的容器中运行(这是基于我迄今为止的研究)。

我的问题可以分为两个问题:

  1. 如何使用多容器解决方案设置多个不同 PHP 应用程序并让它们相互通信? 我是否必须为每个 PHP-FPM 设置一个 NGINX 容器,还是可以设置一个 NGINX 容器并将其与多个不同的 PHP-FPM 容器一起使用?

  2. 多容器解决方案是否适合开发环境?还是我完全错了?

在此先感谢,任何提示将不胜感激!

【问题讨论】:

    标签: php nginx docker


    【解决方案1】:

    既然你问的是多容器环境,我相信你正在为你的应用程序使用 Docker compose。更详细地回答你的问题。

    1) 假设我们在 docker compose 中有三个容器,一个用于 nginx,一个用于 laravel 的 fpm 容器,另一个用于 magento 的 fpm 容器。然后你 docker compose 文件看起来像。下面的sn-p只是一个例子

    nginx:
      image: nginx:latest
      ports:
        - "80:80"
        - "443:443"
      links:
        - "fpmlaravel"
        - "fpmmagento"
    fpmlaravel:
      image: php:latest
      volumes:
        - ./data/laravel/:/var/www/laravel
      links:
        - "nginx"
    fpmmagento:
      image: php:latest
      volumes:
        - ./data/magentoroot/:/var/www/magento
      links:
        - "nginx"
    

    magento 的 nginx vhost 文件是

    # PHP back end
    upstream backend {
        server fpmmagento:9000;
    }
    
    server {
    
        listen 80;
        server_name www.magento.dev magento.dev;
        root /var/www/magento;
    
        location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass backend;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param  HTTPS    $fastcgi_https;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param MAGE_RUN_TYPE $mage_type;
        fastcgi_param MAGE_RUN_CODE $mage_code;
      }
    }
    

    对于 fpm,请确保 fpm 映像正在侦听端口 9000。

    2) 是的,可以有一个 nginx 容器,它基于 nginx 虚拟主机在不同的 fpm 后端之间路由。但是,总的来说,这被认为是一种不好的做法,因为 docker 背后的主要思想是隔离您的应用程序。

    【讨论】:

    • v1 语法被认为已弃用,不应再鼓励。我建议更新您的示例:+1
    • 非常感谢您的详细回复和代码示例,我将在今天晚些时候试一试,并告诉您进展如何。
    • 工作就像一个魅力,感谢您提供所有有用的信息!
    【解决方案2】:

    在单个容器中运行多个进程:

    这一般被认为是反向练习,但我们必须考虑到 nginx 和 fpm 需要一起工作。您可以使用共享卷并将它们分开,但我宁愿看到人们使用 --init 并只允许两个进程,以消除复杂性。

    如果你想走多集装箱路线,我会这样做:

    1. 添加具有单个index.php 文件的服务(nginx),该文件可以为空
    2. 确保 nginx 使用其服务名称将所有 *.php 请求传递给 php 容器
    3. 您的fpm 容器,称为php 将需要所有源代码,位于与您的nginxindx.php 相同的路径中

    【讨论】:

    • 感谢您的回复,虽然我不太明白您的意思是否是不好的做法,以及为什么。此外,您描述的设置非常基本,并且有点无视我的问题的另一部分,即“多应用程序”设置。不过,您提供的信息确实很有用,我会尽快继续研究。
    • 这是不好的做法,除非你为僵尸做准备。在 fpm/nginx 用例中,消除任何复杂性都是可以接受的。祝你好运
    猜你喜欢
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2021-12-17
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多