Docker para desenvolvedor PHP: guia completo de conteinerização

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que seu projeto PHP merece o Docker

\n\n

Você já passou meio dia tentando explicar a um novo desenvolvedor como configurar o ambiente? Ou já se deparou com uma situação em que o código funciona no seu localhost, mas falha no servidor? Familiar? Então este artigo é para você.

\n\n

Docker não é apenas um buzzword da moda. É uma ferramenta que transforma a frase "funciona na minha máquina" em "funciona para todos". Para o desenvolvedor PHP, a conteinerização é um superpoder: você empacota a aplicação, o servidor web e o banco de dados em contêineres leves que se comportam de forma idêntica em qualquer máquina.

\n\n

Neste guia, não vamos ler teoria chata. Vamos direto ao ponto: escreveremos um Dockerfile para PHP, configuraremos a combinação Nginx + PHP-FPM + MySQL com Docker Compose e implantaremos uma aplicação real. Pronto – seu projeto está pronto para deploy!

\n\n

O que é conteinerização e por que ela é importante para o desenvolvedor PHP?

\n\n

Imagine que você está se mudando para um novo apartamento. Em vez de montar os móveis novamente a cada vez (instalar PHP, configurar Apache, instalar módulos), você simplesmente pega uma caixa pronta com seu ambiente. Docker são essas caixas. Elas são chamadas de contêineres.

\n\n

Para PHP, isso é especialmente relevante. As versões do PHP mudam, extensões diferentes são necessárias (gd, mysqli, redis), e em produção tudo precisa ser estável. A conteinerização resolve três problemas principais:

\n
    \n
  • Reprodutibilidade — o ambiente é o mesmo para todos: desenvolvedor, testador, servidor.
  • \n
  • Isolamento — os projetos não entram em conflito (você nunca mais terá um site antigo quebrado devido a uma atualização do PHP).
  • \n
  • Simplicidade de implantação — execução com um único comando docker-compose up.
  • \n
\n\n

Preparando o Dockerfile para a aplicação PHP

\n\n

Vamos começar pelo principal – criar a imagem para o nosso projeto PHP. Suponha que temos uma aplicação simples em PHP 8.2 usando PDO para trabalhar com MySQL. Veja como é um Dockerfile mínimo:

\n\n
# Usamos a imagem oficial do PHP 8.2 com FPM\nFROM php:8.2-fpm-alpine\n\n# Instalamos os pacotes de sistema necessários\nRUN apk add --no-cache \\\n    nginx \\\n    supervisor \\\n    libpq-dev \\\n    && docker-php-ext-install pdo pdo_mysql\n\n# Copiamos as configurações (criaremos elas depois)\nCOPY ./docker/nginx.conf /etc/nginx/nginx.conf\nCOPY ./docker/supervisord.conf /etc/supervisord.conf\n\n# Copiamos o código da aplicação\nCOPY . /var/www/html\n\n# Permissões de escrita para logs e cache\nRUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache\n\n# Abrimos as portas\nEXPOSE 80\n\n# Iniciamos o supervisor (ele gerenciará nginx e php-fpm)\nCMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
\n\n

O que é importante aqui? Usamos a versão alpine – ela pesa muito menos. Instalamos apenas as extensões necessárias com docker-php-ext-install. E sim, usamos o supervisor para que dentro de um único contêiner rodem tanto o Nginx quanto o PHP-FPM. Isso é conveniente para projetos pequenos.

\n\n

Criando a configuração do Nginx

\n\n

Agora precisamos configurar o servidor web. Crie o arquivo docker/nginx.conf:

\n\n
worker_processes auto;\nevents {\n    worker_connections 1024;\n}\n\nhttp {\n    include /etc/nginx/mime.types;\n    default_type application/octet-stream;\n\n    server {\n        listen 80;\n        server_name _;\n        root /var/www/html/public;\n        index index.php index.html;\n\n        location / {\n            try_files $uri $uri/ /index.php?$query_string;\n        }\n\n        location ~ \\.php$ {\n            fastcgi_pass 127.0.0.1:9000;\n            fastcgi_index index.php;\n            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n            include fastcgi_params;\n        }\n    }\n}
\n\n

Observe: o PHP-FPM escuta na porta 9000 dentro do contêiner

Blogs

Book Recommendations