Ao trabalhar com Laravel, é comum a necessidade de configurar o ambiente de desenvolvimento de forma eficiente e padronizada. Uma das melhores práticas nesse contexto é utilizar o Docker, que permite criar contêineres isolados para rodar o aplicativo e seus serviços de forma consistente em diferentes máquinas. Neste post, vamos detalhar como configurar ambiente de desenvolvimento Docker para projetos Laravel de maneira prática e otimizada.
Requisitos Prévios
Antes de iniciar a configuração do Docker para projetos Laravel, é necessário garantir que algumas ferramentas estejam instaladas:
- Docker: Certifique-se de ter o Docker instalado em sua máquina.
- Docker Compose: Ferramenta para gerenciar multi-contêineres Docker de forma simples.
- Laravel: O framework PHP Laravel já deve estar instalado e configurado no seu projeto.
Criando o Dockerfile para Laravel
O primeiro passo para configurar ambiente de desenvolvimento Docker para projetos Laravel é criar o Dockerfile
, que define a imagem do contêiner. Abaixo está um exemplo básico para um ambiente Laravel:
# Use official PHP image with necessary extensions
FROM php:8.1-fpm
# Instale as dependências do sistema
RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev zip git
# Habilite as extensões do PHP
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-install gd pdo pdo_mysql
# Instale o Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Defina o diretório de trabalho
WORKDIR /var/www
# Copie os arquivos do projeto Laravel para o contêiner
COPY . .
# Instale as dependências do Laravel
RUN composer install
# Exponha a porta 9000 para o servidor PHP
EXPOSE 9000
CMD ["php-fpm"]
Criando o Docker Compose para Laravel
O Docker Compose facilita a configuração de múltiplos contêineres, como o PHP, MySQL, e outros serviços necessários para rodar o Laravel. Abaixo está um exemplo de docker-compose.yml
para um projeto Laravel:
version: '3.8'
services:
app:
build:
context: .
container_name: laravel_app
image: laravel_app:latest
restart: unless-stopped
ports:
- "8000:9000"
volumes:
- .:/var/www
networks:
- laravel_network
mysql:
image: mysql:5.7
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: laravel
MYSQL_USER: user
MYSQL_PASSWORD: userpassword
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- laravel_network
volumes:
mysql_data:
networks:
laravel_network:
driver: bridge
Configurando o Laravel para o Docker
Agora que o Dockerfile e o Docker Compose estão configurados, é necessário ajustar o Laravel para usar o MySQL contido no contêiner. No arquivo .env
do Laravel, altere as configurações do banco de dados para corresponder às configurações do contêiner MySQL:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=user
DB_PASSWORD=userpassword
Rodando os Contêineres
Com o Dockerfile
e docker-compose.yml
configurados, o próximo passo é iniciar os contêineres. Execute o comando abaixo no diretório do projeto:
docker-compose up --build
Esse comando irá construir as imagens, iniciar os contêineres e executar o Laravel. O contêiner PHP estará disponível na porta 8000
do seu navegador, acessível em http://localhost:8000
.
Outros Ajustes e Considerações
- Artisan no Docker: Para rodar comandos Artisan dentro do contêiner, use o seguinte comando:
docker-compose exec app php artisan migrate
- Configuração de Cache: Se você encontrar problemas relacionados ao cache, especialmente com permissões de arquivos, adicione as permissões apropriadas ao diretório
storage
ebootstrap/cache
dentro do contêiner:docker-compose exec app chmod -R 777 storage bootstrap/cache
- Utilizando Docker para Produção: Embora a configuração aqui seja focada no desenvolvimento, a mesma abordagem pode ser utilizada para ambientes de produção com alguns ajustes, como otimização de desempenho e segurança.
Essa configuração do Docker para projetos Laravel ajuda a criar um ambiente de desenvolvimento mais robusto, isolado e consistente, eliminando o problema de “funciona na minha máquina” entre diferentes ambientes.