• Twitter
  • GitHub
  • Flickr
  • Skype
  • Contato

Blog

Envio e teste de e-mails em ambiente de desenvolvimento com Mailhog e MhSendmail: Olá! Estou de volta para demonstrar como podemos emular em nosso ambiente de...

Docker containers para aplicações PHP usando Nginx, PHP7-FPM, MariaDB e phpMyAdmin

Olá! Estou de volta e abraçado à portabilidade. Tudo a ver com o assunto de hoje.  Antes de começar, eu vou assumir que você já tem alguma experiência com Docker e deseja executar suas aplicações PHP em containers. Bem, o Docker possibilita o empacotamento de uma aplicação e todas as suas dependências dentro de um container,  tornando-o portável para qualquer outro Host que contenha o Docker instalado. Os Containers Docker não estão ligados a nenhuma infra-estrutura específica: funcionam em qualquer computador, em qualquer infra-estrutura e em qualquer nuvem.

Começando: Tudo num só lugar.

A primeira coisa que você tem a fazer é, naturalmente, instalar o Docker. O segundo pré-requisito é ter o Docker-compose. Este segundo não é obrigatório para se utilizar o Docker, porém com o Compose você usa um arquivo para configurar os serviços do aplicativo. Em seguida, usando um único comando, você cria e inicia todos os serviços de sua configuração. Bem legal, não? Em relação ao Docker-compose, se você não estiver familiarizado, consulte a documentação a seguir: Overview. O objetivo deste artigo é executar uma aplicação usando os repositórios de imagens oficiais Docker tanto para PHP, phpMyAdmin, MariaDB e Nginx . Existem vários repositórios docker combinando essas imagens em uma única, que te fornece todo o ambiente pronto, porém eu prefiro montar tudo separado, para cada recurso a última versão oficial e estável.

Docker-compose Instalação:

curl -L "https://github.com/docker/compose/releases/download/1.8.1/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

Nota: Se você receber um erro "Permissão negada", você precisará instalar o Compose como superusuário.

Pontapé inicial

Um exemplo fácil, vejamos o arquivo docker-compose.yml configurado para rodar uma aplicação com a última versão do Nginx, e mais o redirecionamento da porta 80 para 8080.

web:
    image: nginx:latest
    ports:
        - "8080:80"

Após rodar o comando docker-compose up, uma imagem será baixada e o container é montado. Pronto! Para outra aplicação que utilize o Ngnix, se especificado a mesma imagem nginx:latest no arquivo YAML, o Docker irá utilizar a imagem existente e montar o novo container. Rode o comando docker images para listar as imagens existentes no ambiente local.

Especificar as ligações entre os containers

web:
    image: nginx:latest
    ports:
        - "8080:80"
    links:
        - php
php:
    image: php:7-fpm

Havia a necessidade de especificar ligações entre os containers dentro do arquivo docker-compose.yml, como exibido acima. Ligamos o container web ao container php utilizando vetor associativo em bloco, neste caso, o ‘link:' Na segunda versão não precisamos especificar os links entre os containers. Docker-compose adiciona todos à mesma rede e eles são "vinculados" por padrão.

Docker-compose v2

version: "2"
services:
 
  web:
      image: nginx:latest
      ports:
        - "8080:80"
 
  php:
     image: php:7-fpm

Volumes: Sincronizando arquivos de configuração e/ou diretórios.

...
volumes:
   - ./caminho/localcode:/hostcode
   - ./localconf/site.conf:/etc/nginx/conf.d/site.conf

Para sincronizar arquivos de configuração e/ou diretórios local no container,o Docker cria um volume por meio de uma simples notação. Então, o código em nosso ambiente /caminho/localcode e a opção por nomear o volume como hostcode para o container, teremos então: /caminho/localcode:/hostcode. Se por exemplo, o caminho /hostcode já existir dentro da imagem do container, o mount /caminho/localcode sobrepõe mas não remove o conteúdo pré-existente. Uma vez que a montagem é removida, o conteúdo é acessível novamente. Isso é consistente com o comportamento esperado do comando mount.

Saiba mais

  • Os volumes de dados podem ser compartilhados e reutilizados entre os containers.
  • As alterações em um volume de dados são feitas diretamente.
  • As alterações a um volume de dados não serão incluídas quando atualizar uma imagem.
  • Os volumes de dados persistem mesmo se o próprio recipiente for excluído.
  • Os volumes de dados são projetados para persistir dados, independentemente do ciclo de vida do container. Docker, portanto, nunca exclui automaticamente volumes quando você remove um container.

LEMP stack

O acrônimo que descreve um sistema operacional Linux, com um servidor web Nginx. Os dados do back-end são armazenados no banco de dados, aqui MariaDB e o processamento dinâmico é manipulado pelo PHP. No nosso mundo Docker, o arquivo docker-compose.yml receberá as notações para se criar um ambiente que rode PHP, MariaDB, Nginx e mais o phpMyAdmin.  Veja abaixo e logo depois algumas explicações sobre o mesmo.

version: "2"
 
services:
  web:
   image: nginx:latest
   container_name: Nginx
   ports:
   - "80:80"
   volumes:
   - ./public:/public
   - ./src/site.conf:/etc/nginx/conf.d/site.conf
   - ./src/nginx/logs:/var/log/nginx/
 
  php:
   image: php:7-fpm
   container_name: PHP7
   volumes:
   - ./public:/public
 
  db:
   image: mariadb:latest
   container_name: MariaDB
   volumes:
    - ./src/mariadb:/var/lib/mysql
   environment:
    MYSQL_RANDOM_ROOT_PASSWORD: 1
    MYSQL_DATABASE: dev
    MYSQL_USER: dev
    MYSQL_PASSWORD: dev123
   expose:
   - 3306
 
  pma:
   image: phpmyadmin/phpmyadmin
   container_name: PHPMyAdmin
   environment:
    PMA_ARBITRARY: 1
    PMA_HOST: db
    PMA_USER: dev
    PMA_PASSWORD: dev123
    PHP_UPLOAD_MAX_FILESIZE: 1G
    PHP_MAX_INPUT_VARS: 1G
   restart: always
   ports:
   - "8001:80"
   volumes:
   - ./src/sessions:/sessions 

Explicação

Uma breve descrição sobre as notações mais importantes dentro do arquivo docker-compose.yml.
Neste arquivo, especificamente no volume do serviço Ngnix, há uma chamada ao arquivo site.conf,  o próximo passo é permitir que o Nginx saiba que essa configuração existe.
Vamos criar o site.conf no nível /src/site.conf com o seguinte conteúdo:

server {
    index index.php index.html;
    server_name myhost.dev;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /public;
 
    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;
    }
} 

1 - server_name myhost.dev;  - O nome do servidor

Não esqueça de configurar o arquivo HOST

O arquivo “hosts” é utilizado pelos sistemas operacionais para relacionar hostnames e endereços IP. A edição dos arquivos de host no Linux deverá ser feito pelo seguinte comando:

$ sudo nano /etc/hosts

Adicione o mesmo nome, logo após localhost:

127.0.0.1       localhost myhost.dev

2 - root /public; - Especificando a pasta raiz

Será o mesmo caminho definido em ‘volumes’ do Ngnix.

3 - E finalmente configurar o Nginx para usar o container PHP-FPM para interpretar arquivos PHP.

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


Se quiser clonar, os arquivos estão no GitHub. Até!
BUILD, SHIP, RUN