使用Docker的PHP开发环境

使用Docker的PHP开发环境,php,nginx,docker,Php,Nginx,Docker,我目前正在尝试使用NGINX和PHP-FPM Docker容器设置一个PHP开发环境 现在我知道,这可以作为运行两个服务的单个容器来实现,甚至可以作为多容器设置来实现,其中每个服务都运行在自己的容器中(这是基于我目前的研究) 我的问题可以分为两个问题: 如何使用多容器解决方案设置多个不同的PHP应用程序,并让它们彼此通信? 我是否必须为每个PHP-FPM设置一个NGINX容器,或者我是否可以设置一个NGINX容器并将其与多个不同的PHP-FPM容器一起使用 对于开发环境来说,多容器解决方案是好的

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

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

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

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

  • 对于开发环境来说,多容器解决方案是好的吗?还是我完全错了


  • 提前感谢,任何提示都将不胜感激

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

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

    如果您希望沿着多集装箱路线,我将执行以下操作:

  • 添加一个具有单个
    index.php
    文件的服务(nginx),该文件可以为空
  • 确保nginx使用其服务名称将所有
    *.php
    请求传递到
    php
    容器
  • 名为
    php
    fpm
    容器将需要所有源代码,与
    nginx
    indx.php
    路径相同

  • 因为您询问的是多容器环境,所以我相信您的应用程序使用的是Docker compose。更详细地回答你的问题

    1) 假设docker compose中有三个容器,一个用于nginx,一个用于laravel的fpm容器,另一个用于magento的fpm容器。然后您将看到docker编写的文件。下面的代码片段只是一个示例

    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 vhost在不同的fpm后端之间路由。但是,一般来说,这被认为是一种不好的做法,因为docker背后的主要思想是隔离应用程序。

    v1语法被认为是不推荐的,不应该再鼓励使用了。我建议更新您的示例:+1非常感谢您的详细回答和代码示例,今天晚些时候我将对此进行一次尝试,并让您知道它是如何进行的。非常有用,谢谢您提供的所有有用信息!谢谢你的回复,虽然我不太明白你是不是说这是一个坏习惯,以及为什么。此外,您描述的设置非常基本,有点忽略了我问题的另一部分,即“多应用程序”设置。尽管如此,你提供的信息确实很有用,我会尽快继续调查。这是一种不好的做法,除非你为僵尸做好准备。在fpm/nginx用例中,可以消除任何复杂性。祝你好运