Preparar um ambiente de desenvolvimento ou produção para uma aplicação Laravel utilizando Docker Compose é uma abordagem eficiente e escalável. Com Docker Compose, podemos definir e gerenciar facilmente múltiplos contêineres que compõem nossa aplicação, incluindo o Laravel, um servidor web Nginx e um banco de dados MySQL. Este método oferece vantagens como isolamento de recursos, facilidade de implantação e consistência entre ambientes de desenvolvimento e produção.
Para começar, é necessário criar um arquivo docker-compose.yml na raiz do projeto Laravel, onde especificaremos os serviços necessários e suas configurações. Vamos dividir o processo em três partes: serviço do Laravel, serviço do Nginx e serviço do MySQL.
Serviço do Laravel:
O serviço do Laravel será responsável por executar o código da nossa aplicação. Aqui está um exemplo básico de como configurar esse serviço no arquivo docker-compose.yml:
yamlversion: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/var/www/html
working_dir: /var/www/html
Este trecho define um serviço chamado “app” que utiliza um arquivo Dockerfile para construir a imagem do contêiner. Ele monta o diretório atual (onde está localizado o código do Laravel) dentro do contêiner em /var/www/html e define este como o diretório de trabalho.
Serviço do Nginx:
O serviço do Nginx é responsável por servir as requisições web para a nossa aplicação Laravel. Abaixo está um exemplo de como configurar este serviço no arquivo docker-compose.yml:
yaml nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
Este trecho define um serviço chamado “nginx” que utiliza a imagem oficial do Nginx. Ele mapeia a porta 80 do host para a porta 80 do contêiner Nginx. Além disso, monta um arquivo de configuração personalizado nginx.conf para o diretório /etc/nginx/nginx.conf dentro do contêiner.
Serviço do MySQL:
O serviço do MySQL é responsável por fornecer o banco de dados para nossa aplicação Laravel. Veja um exemplo de configuração para este serviço no docker-compose.yml:
yaml db:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: your_mysql_root_password
MYSQL_DATABASE: your_database_name
MYSQL_USER: your_mysql_user
MYSQL_PASSWORD: your_mysql_password
volumes:
- ./mysql:/var/lib/mysql
Neste trecho, definimos um serviço chamado “db” que utiliza a imagem oficial do MySQL 5.7. Especificamos variáveis de ambiente para configurar a senha do usuário root, nome do banco de dados, nome do usuário e senha do MySQL. Também montamos um volume para persistir os dados do MySQL fora do contêiner.
Configuração do arquivo Nginx:
Por fim, é necessário configurar o arquivo nginx.conf para direcionar as solicitações HTTP para o serviço Laravel. Um exemplo de configuração básica é:
perlserver {
listen 80;
server_name localhost;
location / {
proxy_pass http://app:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Neste exemplo, as solicitações HTTP recebidas pelo Nginx são encaminhadas para o serviço do Laravel definido como “app” no Docker Compose.
Executando a aplicação:
Após configurar o docker-compose.yml e o arquivo de configuração do Nginx, você pode executar sua aplicação Laravel usando o seguinte comando na raiz do projeto:
bashdocker-compose up --build
Este comando irá construir as imagens dos contêineres e iniciar todos os serviços definidos no arquivo docker-compose.yml. Uma vez que todos os serviços estejam em execução, você pode acessar sua aplicação Laravel em http://localhost.
Em resumo, o uso do Docker Compose para configurar um ambiente de desenvolvimento ou produção para uma aplicação Laravel com um servidor Nginx e um banco de dados MySQL oferece uma solução conveniente e escalável, permitindo uma fácil implantação e gerenciamento dos contêineres que compõem a aplicação. Este método promove a consistência entre ambientes de desenvolvimento e produção, além de proporcionar isolamento de recursos e facilitar a colaboração em equipe.
“Mais Informações”

Claro! Vamos aprofundar um pouco mais em cada aspecto do processo de configuração de um ambiente Docker Compose para uma aplicação Laravel, incluindo detalhes sobre a estrutura do projeto, a configuração dos serviços e algumas práticas recomendadas.
Estrutura do Projeto:
Antes de mais nada, é importante organizar o projeto Laravel de forma adequada. O Docker Compose espera encontrar um arquivo docker-compose.yml na raiz do projeto, então certifique-se de que seu projeto Laravel está estruturado dessa forma. Além disso, é recomendável criar um diretório nginx para armazenar o arquivo de configuração do Nginx (por exemplo, nginx.conf) e um diretório mysql para armazenar os dados do banco de dados MySQL, ambos na raiz do projeto.
Configuração dos Serviços:
-
Serviço do Laravel (
app):- O Dockerfile para o serviço Laravel geralmente é bastante simples e consiste em instalar as dependências PHP necessárias, copiar o código-fonte da aplicação para o contêiner e expor a porta necessária para o servidor web interno do Laravel (geralmente a porta 80).
- Além disso, é comum instalar as dependências do Composer durante o processo de construção do contêiner para evitar problemas de compatibilidade ou dependências ausentes.
-
Serviço do Nginx (
nginx):- O Nginx é configurado para encaminhar as solicitações HTTP para o servidor web interno do Laravel. No arquivo
nginx.conf, é necessário definir uma configuração de proxy reverso para encaminhar as solicitações para o serviço Laravel definido no Docker Compose. - É importante configurar o Nginx para servir os arquivos estáticos da aplicação (como imagens, CSS e JavaScript) diretamente, enquanto as solicitações dinâmicas são encaminhadas para o Laravel.
- O Nginx é configurado para encaminhar as solicitações HTTP para o servidor web interno do Laravel. No arquivo
-
Serviço do MySQL (
db):- No serviço do MySQL, é necessário configurar variáveis de ambiente para definir a senha do usuário root, o nome do banco de dados, o nome de usuário e a senha do MySQL.
- Além disso, é recomendável montar um volume para persistir os dados do MySQL fora do contêiner, garantindo que os dados não sejam perdidos quando o contêiner for reiniciado.
Práticas Recomendadas:
-
Utilize Imagens Oficiais:
- Sempre que possível, utilize imagens oficiais do Docker Hub para garantir a confiabilidade e a segurança das imagens utilizadas em seu ambiente Docker Compose. Por exemplo, para o MySQL, utilize a imagem oficial
mysql, e para o Nginx, utilize a imagem oficialnginx.
- Sempre que possível, utilize imagens oficiais do Docker Hub para garantir a confiabilidade e a segurança das imagens utilizadas em seu ambiente Docker Compose. Por exemplo, para o MySQL, utilize a imagem oficial
-
Gerenciamento de Variáveis de Ambiente:
- Evite armazenar informações sensíveis, como senhas e chaves de API, diretamente no arquivo
docker-compose.yml. Em vez disso, utilize variáveis de ambiente para configurar essas informações de forma segura e flexível.
- Evite armazenar informações sensíveis, como senhas e chaves de API, diretamente no arquivo
-
Separar Ambientes:
- É comum ter diferentes arquivos
docker-compose.ymlpara diferentes ambientes, como desenvolvimento, teste e produção. Cada arquivo pode conter configurações específicas para o ambiente correspondente, como senhas diferentes para o banco de dados ou configurações de depuração habilitadas no ambiente de desenvolvimento.
- É comum ter diferentes arquivos
-
Monitoramento e Logs:
- Configure ferramentas de monitoramento e registro de logs para os contêineres Docker, como Prometheus e Grafana, para acompanhar o desempenho da aplicação e diagnosticar problemas de forma proativa.
-
Orquestração de Contêineres:
- Considere o uso de ferramentas de orquestração de contêineres, como Kubernetes, para gerenciar e dimensionar aplicativos Docker Compose em ambientes de produção.
Ao seguir estas práticas recomendadas e compreender a estrutura e configuração dos serviços em um ambiente Docker Compose para uma aplicação Laravel, você estará bem posicionado para criar um ambiente de desenvolvimento ou produção eficiente, escalável e confiável para sua aplicação.

