PHP

28 out, 2019

Criando um ambiente de desenvolvimento PHP mínimo com Docker – Parte 3

Publicidade

Fala devs, vamos com a terceira e última parte? Este artigo faz parte de uma série onde escrevo sobre docker e mostro como é simples configurar um ambiente de desenvolvimento mínimo utilizando containers.

Série completa:

  1. Conceitos básicos, caso de uso, vantagens e instalação
  2. Criação de um ambiente PHP
  3. Servidor web e banco de dados

Para enriquecer o nosso ambiente de desenvolvimento docker iremos adicionar um container de banco de dados (MySQL) e um servidor web (Nginx), mas você pode adicionar containers conforme as necessidades do seu ambiente de desenvolvimento ou projeto seguindo este fluxo.

MySQL:

O conteúdo do arquivo docker-compose.yml deverá ser modificado, pois iremos adicionar o novo container, ficando assim:

 

version: "3.7" 
services:
  php:
    build:
      context: .
    image: phpdocker
    container_name: php
    ports:
      - "9000:9000"
    volumes:
      - ".:/var/www/html/"
    command: php -S 0.0.0.0:9000 -t public/
    links:
      - mysql
  mysql:
    image: mysql:5.7
    container_name: mysql
    ports:
      - "3307:3306"
    volumes:
      - mysql:/var/lib/mysql/
    environment:
      MYSQL_DATABASE: 'database'
      MYSQL_USER: 'root'
      MYSQL_PASSWORD: '12345678'
      MYSQL_ROOT_PASSWORD: '12345'
volumes:
  mysql:

Nele, estamos declarando a utilização da imagem mysql:5.7, definindo as credenciais de acesso, apontando a relação de dependência com o MySQL através da tag link, bem como a porta em que será executado e o mapeamento de volumes. Este último faz com que não percamos o que foi persistido nos bancos de dados após “derrubarmos” o container.

Testando PHP + MySQL:

Para fins didáticos, modifique o arquivo public/index.php e insira o seguinte conteúdo:

<?php
$pdo = null;
try {
    $pdo = new PDO('mysql:host=mysql;dbname=database', 'root', '12345');
} catch (PDOException $e) {
    print $e->getMessage();
    die();
}
var_dump($pdo);

O código acima realiza uma conexão com a base dados database que foi declarada como banco de dados padrão no container de MySQL.

Se tudo deu certo, você pode “subir” os containers com o comando e docker-compose up -d e verificar se a conexão foi realizada com sucesso através do browser no seguinte endereço:

http://localhost:9000/

Nginx:

Será necessário criar um arquivo com as configurações do servidor web. Para isso, crie um diretório chamado webserver e dentro dele, o arquivo nginx.conf com o seguinte conteúdo:

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid       /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request"'
                    '$status $body_bytes_sent "$http_referer"'
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;

    keepalive_timeout 65;

    server {

        listen       80;
        server_name  localhost;
        root         /var/www/html/public/;
        autoindex    on;
        index        index.php;

        location / {

            try_files $uri $uri/ /index.php;       

            location = /index.php {

                fastcgi_pass   php:9000;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include        fastcgi_params;

            }     
           
        }

        location ~ \.php$ {
            return 444;
        }

    }
}

O conteúdo do arquivo docker-compose.yml deverá pela última vez ser modificado para adicionarmos o nosso container de servidor web, ficando assim:

version: "3.7" 
services:
  nginx:
    image: nginx:1.17.3
    container_name: nginx
    ports:
      - "8080:80"
    volumes:
      - ".:/var/www/html/"
      - "./webserver/nginx.conf:/etc/nginx/nginx.conf"
    links:
      - php
      - mysql
  php:
    build:
      context: .
    image: phpdocker
    container_name: php
    ports:
      - "9000:9000"
    volumes:
      - ".:/var/www/html/"
    # command: php -S 0.0.0.0:9000 -t public/
    # links:
      # - mysql
  mysql:
    image: mysql:5.7
    container_name: mysql
    ports:
      - "3307:3306"
    volumes:
      - mysql:/var/lib/mysql/
    environment:
      MYSQL_DATABASE: 'database'
      MYSQL_USER: 'root'
      MYSQL_PASSWORD: '12345678'
      MYSQL_ROOT_PASSWORD: '12345'
volumes:
  mysql:

Nele, estamos declarando a utilização da imagem nginx:1.17.3, definindo o mapeamento dos volumes (diretório de trabalho e arquivo de configurações), a porta em que estará disponível e apontando as dependências, que agora não serão mais definidas no container de PHP, e é por isso que as linhas 24 e 25 foram comentadas.

Podemos observar que o comando que foi declarado na linha 25 também foi comentado, uma vez que a partir de agora nossa aplicação será executada pelo servidor web e não mais pelo servidor embutido do PHP.

Se tudo deu certo, você pode “subir” os containers com o comando e docker-compose up -d e acessar a aplicação através do browser no seguinte endereço:

http://localhost:8080/

Conclusão:

Se você clonar este repositório terá o ambiente docker desenvolvido nessa série pronto para uso em sua máquina!

Sei que são infinitas as possibilidades quando falamos sobre a utilização de containers docker, mas o propósito deste grupo de artigos é mostrar como é simples trazer isso para o nosso dia a dia de forma tranquila e sem pesadelos.

Chegamos ao final da série “Criando um ambiente de desenvolvimento PHP mínimo com Docker” e eu espero que este conteúdo seja útil para a comunidade!

Obrigado e forte abraço!