Criando contêiner Docker NGINX com PHP

Featured image

Neste guia rápido irei mostrar como criar um contêiner passo a passo com NGINX e PHP 7.2. Para iniciarmos iremos criar um arquivo Dockerfile que se baseará na imagem PHP Oficial Alpine Linux que temos no Docker Hub: Dockerfile - 1ª linha

FROM php:7.2-fpm-alpine3.11

Como a imagem já contém o PHP-FPM 7.2 precisaremos apenas instalar o NGINX e um Supervisor de processos simultâneos com o seguinte linha:

Dockerfile - 2ª linha

RUN apk add --no-cache nginx supervisor

Precisamos agora criar um arquivo por nome nginx.ini para montarmos as configurações necessárias para o supervisor subir todos os processos corretamente:

```config
[program:nginx]
command=/usr/sbin/nginx -g "pid /run/nginx.pid; daemon off;"
autostart=true
autorestart=true
startretries=5
numprocs=1
startsecs=0
process_name=%(program_name)s_%(process_num)02d
stderr_logfile=/var/log/nginx/%(program_name)s_stderr.log
stderr_logfile_maxbytes=10MB
stdout_logfile=/var/log/nginx/%(program_name)s_stdout.log
stdout_logfile_maxbytes=10MB

[program:php-fpm]
command = /usr/local/sbin/php-fpm -FR
user = root
autostart = true
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0

Em seguida adicionar no Dockerfile:

Dockerfile - 3ª linha

COPY nginx.ini /etc/supervisor.d/nginx.ini

Agora criaremos um arquivo por nome default.conf com o intuito de configurarmos o NGINX para reconhecer arquivos *.php e interpreta-los.

```shell
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_read_timeout 300;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location ~ /\.ht {
        deny all;
    }
}

Adicionamos no Dockerfile:

Dockerfile - 4ª linha

COPY default.conf /etc/nginx/conf.d/default.conf

Opcional: Para testarmos se o container foi configurado corretamente, adicionaremos o arquivo index.php.


```php
<?php
    phpinfo();
?>

Adicionamos também no nosso Dockerfile:

Dockerfile - 5ª linha

COPY index.php /var/www/html/index.php

Adicionaremos dois comandos sed com RUN para os últimos ajustes no ambiente:

Dockerfile - 6ª linha

RUN sed -i 's/\;nodaemon\=false/nodaemon\=true/g' /etc/supervisord.conf ; \ # substituirá uma linha no arquivo de configuração para que o serviço supervisord não inicie no modo daemon.
    sed -i 's/user nginx\;/user www\-data\;/' /etc/nginx/nginx.conf # substituirá uma linha no arquivo de configuração do NGINX para que o mesmo suba todos os Workers com permissões do usuário www-data

Para finalizarmos, iremos informar ao nosso contêiner que executará o serviço do Supervisord, que por si subirá o NGINX e PHP-FPM com seus Workers. Dockerfile - 7ª linha

CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

O Dockerfile com todos os arquivos que criamos estará em meu GitHub:

FROM php:7.2-fpm-alpine3.11
LABEL maintainer=Cristianovisk
LABEL baseimage=AlpinePHP
RUN apk add --no-cache nginx \
        supervisor
COPY nginx.ini /etc/supervisor.d/nginx.ini
COPY default.conf /etc/nginx/conf.d/default.conf
COPY index.php /var/www/html
RUN sed -i 's/\;nodaemon\=false/nodaemon\=true/g' /etc/supervisord.conf ;\
    sed -i 's/user nginx\;/user www\-data\;/' /etc/nginx/nginx.conf
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

Agora é só criar a imagem com o comando docker build . -t nginx_php:1.0 estando dentro da pasta com todos os arquivos:

Dockerbuildimg

E testamos com o comando docker run -d -p 80:80 --name nginx-php-image nginx_php:1.0:

Dockerrunimg

Acessamos pelo navegador http://127.0.0.1/ e pronto: indexphpnginximg Observação: os plugins do PHP estão disponíveis a sua maioria no repositório Alpine basta instala-los.

Exemplo: apk update depois apk add php7-pgsql --no-cache

Veja todos os complementos disponíveis: apk search php apksearch

A imagem estará disponível para download com o comando docker pull cristianovisk/nginx_php:latest