Docker e PHP: guia completo para conteinerização de aplicações
O desenvolvimento web moderno é impensável sem conteinerização. Docker tornou-se o padrão de facto para empacotar, distribuir e executar aplicações. Para desenvolvedores PHP, usar Docker resolve muitos problemas: desde incompatibilidade de versões do PHP até dificuldades com configuração de ambiente em diferentes máquinas. Neste artigo, vamos analisar como conteinerizar uma aplicação PHP do zero, usando Docker e docker-compose.
1. Fundamentos do Docker para desenvolvedores PHP
Docker é uma plataforma para desenvolvimento, distribuição e execução de aplicações em ambientes isolados (contêineres). Cada contêiner contém tudo o que é necessário para funcionar: código, bibliotecas, utilitários do sistema e configurações. Para PHP, isso é especialmente relevante, pois a aplicação frequentemente depende de uma versão específica do interpretador, extensões (por exemplo, pdo_mysql, redis, gd) e do servidor web (Apache ou Nginx).
Componentes principais do Docker:
- Dockerfile — arquivo de texto com instruções para construir a imagem.
- Imagem (Image) — modelo imutável para criar contêineres.
- Contêiner (Container) — instância em execução da imagem.
- docker-compose — ferramenta para definir e executar aplicações com múltiplos contêineres.
2. Criando um Dockerfile para aplicação PHP
Vamos começar com um exemplo simples. Suponha que temos uma aplicação PHP no framework Laravel ou Symfony. Vamos criar um arquivo Dockerfile na raiz do projeto:
# Usamos a imagem oficial do PHP 8.2 com FPMFROM php:8.2-fpm-alpine
# Definimos o diretório de trabalhoWORKDIR /var/www/html
# Instalamos dependências do sistema e extensões PHPRUN apk add --no-cache \ git \ unzip \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ pdo_mysql \ mbstring \ exif \ pcntl \ bcmath \ gd
# Instalamos o ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Copiamos os arquivos do projetoCOPY . .
# Definimos permissões (para Laravel/Symfony)RUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 storage bootstrap/cache
# Abrimos a porta 9000 (PHP-FPM)EXPOSE 9000
# Comando de inicializaçãoCMD ["php-fpm"]Este Dockerfile faz o seguinte:
- Usa a imagem leve
php:8.2-fpm-alpine. - Instala as extensões necessárias:
pdo_mysql,gd,mbstringe outras. - Copia o Composer da imagem oficial.
- Transfere o código da aplicação.
- Configura permissões de acesso para cache e logs.
3. Configuração do docker-compose: PHP + Nginx + MySQL
Para um projeto real, precisaremos de um servidor web e um banco de dados. Vamos criar o arquivo docker-compose.yml:
version: '3.8'
services: # Serviço PHP-FPM php: build: context: . dockerfile: Dockerfile container_name: app_php volumes: - .:/var/www/html networks: - app-network
# Servidor web Nginx nginx: image: nginx:alpine container_name: app_nginx ports: - "8080:80" volumes: - .:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php networks: - app-network
# Banco de dados MySQL mysql: image: mysql:8.0 container_name: app_mysql environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: app_db MYSQL_USER: app_user MYSQL_PASSWORD: app_password ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql networks: -