Объединение PHP-fpm с nginx в одном dockerfile

Мне нужно объединить php-fpm с nginx в одном dockerfile для производственного развертывания.

Так что лучше:

(1) Запустите dockerfile, используя php:7.1.8-fpm, а затем установите поверх него слой изображения nginx?

(2) Или вы рекомендуете использовать образ nginx, а затем установить php-fpm с помощью apt-get?

PS: у меня нет опции сборки docker-compose для производственного развертывания. В моей среде разработки я уже использую docker-compose и легко собираю мультиконтейнерное приложение из двух изображений. Наша организация devops не поддерживает развертывание на основе docker для среды prod.

2 ответа

Установка Nginx намного проще, чем PHP, поэтому вам будет проще установить Nginx в готовый к использованию официальный образ PHP. Вот пример 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-fpm будет запущен как действие по умолчанию для официального образа PHP):

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

Конечно, это не лучший путь с точки зрения лучшей практики, но я надеюсь, что это ответ на ваш вопрос.

Вы должны развернуть два контейнера, один с fpmдругой с nginx, и вы должны связать их. Даже если вы можете использовать supervisor для того, чтобы контролировать несколько процессов в одном контейнере, Docker философия состоит в том, чтобы иметь один процесс на контейнер.

Что-то вроде:

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

С site.conf с

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

(Позорно вдохновленный http://geekyplatypus.com/dockerise-your-php-application-with-nginx-and-php7-fpm/)

Другие вопросы по тегам