在一个dockerfile中结合PHP-fpm和nginx

我需要将php-fpm和nginx合并到一个dockerfile中进行生产部署。 </ p>

最好是:</ p>

(1)使用php:7.1.8-fpm启动dockerfile,然后在顶部安装nginx图像层 它? </ p>

(2)或者您是否建议使用nginx图像,然后使用apt-get安装php-fpm?</ p>

PS:我没有 用于生产部署的docker-compose构建选项。 在我的开发环境中,我已经使用docker-compose并轻松地从两个图像构建多容器应用程序。 我们的组织devop不支持基于docker-compose的prod环境部署。</ p>
</ div>

展开原文

原文

我需要将php-fpm与nginx结合在一个dockerfile中进行生产部署。

所以更好的方法是:

(1)使用php:7.1.8-fpm启动dockerfile,然后在其之上安装nginx映像层?

(2)还是建议使用Nginx映像,然后使用apt-get安装php-fpm?

PS:我没有用于生产部署的docker-compose构建选项。 在我的开发环境中,我已经使用docker-compose并从两个映像轻松构建多容器应用程序。 我们的组织开发人员不支持针对产品环境的基于docker-compose的部署。

2个回答

Nginx installation is much easier than PHP so it should be easier for you to install Nginx into ready-to-use official PHP image. Here is the example Dockerfile showing how your goal can be reached with example of installing few PHP extensions:

FROM php:7.2-fpm

RUN apt-get update -y \
    && apt-get install -y nginx

# PHP_CPPFLAGS are used by the docker-php-ext-* scripts
ENV PHP_CPPFLAGS="$PHP_CPPFLAGS -std=c++11"

RUN docker-php-ext-install pdo_mysql \
    && docker-php-ext-install opcache \
    && apt-get install libicu-dev -y \
    && docker-php-ext-configure intl \
    && docker-php-ext-install intl \
    && apt-get remove libicu-dev icu-devtools -y
RUN { \
        echo 'opcache.memory_consumption=128'; \
        echo 'opcache.interned_strings_buffer=8'; \
        echo 'opcache.max_accelerated_files=4000'; \
        echo 'opcache.revalidate_freq=2'; \
        echo 'opcache.fast_shutdown=1'; \
        echo 'opcache.enable_cli=1'; \
    } > /usr/local/etc/php/conf.d/php-opocache-cfg.ini

COPY nginx-site.conf /etc/nginx/sites-enabled/default
COPY entrypoint.sh /etc/entrypoint.sh

COPY --chown=www-data:www-data . /var/www/mysite

WORKDIR /var/www/mysite

EXPOSE 80 443

ENTRYPOINT ["/etc/entrypoint.sh"]

The nginx-site.conf file contain your nginx http host configuration. The example below is for Symfony app:

server {
    root    /var/www/mysite/web;

    include /etc/nginx/default.d/*.conf;

    index app.php index.php index.html index.htm;

    client_max_body_size 30m;

    location / {
        try_files $uri $uri/ /app.php$is_args$args;
    }

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        # Mitigate https://httpoxy.org/ vulnerabilities
        fastcgi_param HTTP_PROXY "";
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index app.php;
        include fastcgi.conf;
    }
}

The entrypoint.sh will run nginx and php-fpm on container startup (otherwise only php-fpm will be started as the default action of the official PHP image):

#!/usr/bin/env bash
service nginx start
php-fpm

Ofcourse this is not a best way from the best practise prospective but I hope this is the answer for your question.

dqef7931
dqef7931 使用ENTRYPOINT [“sh”,“/ etc / entrypoint.sh”]将避免获得权限被拒绝错误。
大约一年之前 回复



你应该部署两个容器,一个用 fpm </ code>,另一个用 nginx </ code> 你应该链接它们。
即使你可以使用 supervisor </ code>来监视同一个容器中的多个进程, Docker </ code>的理念是每个容器有一个进程。 / p>

类似于:</ p>

  docker run --name php -v ./code:/code php:7-fpm 
docker run - -name nginx -v ./code:/code -v site.conf:/etc/nginx/conf.d/site.conf --link php nginx:latest
</ code> </ pre>

site.conf </ code> with </ p>

  server {
index index.php index.html;
server_name php-docker.local;

error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root / code;

location~ \ .php $ {
try_files $ uri = 404;
fastcgi_split_path_info ^(。+ \ .php)(/。+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
包括fastcgi_ params;
fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
fastcgi_param PATH_INFO $ fastcgi_path_info;
}
}
</ code> </ pre>

(由 http://geekyplatypus.com/dockerise-your-php-application- with-nginx-and-php7-fpm / )</ p>
</ div>

展开原文

原文

You should deploy two container, one with fpm, the other with nginx, and you should link them. Even though you can use supervisor in order to monitore multiple processes within the same container, Docker philosophy is to have one process per container.

Something like:

docker run --name php -v ./code:/code php:7-fpm
docker run --name nginx -v ./code:/code -v site.conf:/etc/nginx/conf.d/site.conf --link php nginx:latest

With site.conf with

server {
    index index.php index.html;
    server_name php-docker.local;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /code;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

(Shamefully inspired by http://geekyplatypus.com/dockerise-your-php-application-with-nginx-and-php7-fpm/)

douhuang75397
douhuang75397 如果你真的需要只使用一个图像,你应该从debian或alpine开始,安装nginx和php-fpm,然后运行supervisord。 另一种可能性是使用不需要其他进程来使用PHP的apache。
接近 3 年之前 回复
duanlan7239
duanlan7239 当我在一个容器中运行php-fpm和nginx时,fastcgi_pass将指向unix sock文件或127.0.0.1:9000
接近 3 年之前 回复
dspld86684
dspld86684 问题是我们的DevOps只需要一个docker文件,并重用他们现有的部署堆栈脚本,它只进行一次docker build,然后运行docker。 规则是一个服务应该有一个dockerfile。 如果我必须像上面提到的那样运行多个容器,那么使用docker-compose就更简单了(我用它来开发......但生产环境是另一回事)。
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐