Por que seu projeto PHP merece o Docker
\n\nVocê 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ê.
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\nNeste 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\nO que é conteinerização e por que ela é importante para o desenvolvedor PHP?
\n\nImagine 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\nPara 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
Preparando o Dockerfile para a aplicação PHP
\n\nVamos 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:
# 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\nO 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.
Criando a configuração do Nginx
\n\nAgora precisamos configurar o servidor web. Crie o arquivo docker/nginx.conf:
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\nObserve: o PHP-FPM escuta na porta 9000 dentro do contêiner