web-dev-qa-db-ja.com

1つのdockerfileでPHP-fpmとnginxを組み合わせる

本番環境での展開では、php-fpmとnginxを1つのdockerfileで組み合わせる必要があります。

それで:

(1)php:7.1.8-fpmを使用してdockerfileを起動し、nginxイメージレイヤーをその上にインストールしますか?

(2)または、nginxイメージを使用してから、apt-getを使用してphp-fpmをインストールすることをお勧めしますか?

PS:実稼働環境でのデプロイ用のdocker-composeビルドオプションはありません。私の開発環境では、すでにdocker-composeを使用して、2つのイメージからマルチコンテナーアプリを簡単に構築しています。私たちの組織の開発は、製品環境のdocker-composeベースのデプロイメントをサポートしていません。

14
Andy

NginxのインストールはPHPよりもはるかに簡単なので、すぐに使える公式のPHPイメージにNginxをインストールする方が簡単です。ここにDockerfileの例を示します。いくつかのPHP拡張機能をインストールする例を使用して、目標を達成する方法を示します。

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"]

nginx-site.confファイルには、nginx httpホスト構成が含まれています。以下の例はSymfonyアプリ用です:

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;
    }
}

entrypoint.shはコンテナの起動時にnginxとphp-fpmを実行します(そうでない場合、公式のPHP画像)のデフォルトアクションとしてphp-fpmのみが起動されます):

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

もちろん、これはベストプラクティスの観点からは最善の方法ではありませんが、これがあなたの質問に対する答えであることを願っています。

17