DEV Community

Cover image for Sugestão de como aplicar Docker em projeto Laravel legado
Jonathas Montenegro
Jonathas Montenegro

Posted on

Sugestão de como aplicar Docker em projeto Laravel legado

O propósito deste tutorial é para aplicar o docker em um projeto Laravel para ambiente de desenvolvimento local. Não recomendo aplicação para produção. O fato de não recomendar é mais por falta de testes e experiência em produção com essa configuração mesmo. Mas em todos projetos Laravel que eu apliquei este passo a passo funcionou.

Lembrando que este tutorial é uma sugestão baseado na minha experiência e que funcionou comigo. Ainda não tenho suficiente experiência para afirmar que este é o melhor método, mas certamente serviu ao propósito para entender melhor o funcionamento do docker. :)

Após esta configuração, a criação do ambiente de desenvolvimento ficou incrivelmente mais rápido pra mim. Não é mais necessário utilizar Wampp, Xampp ou derivados, basta clonar o repositório do github, instalar docker e seguir o passo a passo a partir da inicialização do container. Principalmente quando se trabalha com projetos de versões diferentes de PHP ou outras dependências.

...

INICIO:

  • Primeiro instalar o Docker e o Docker-compose (você pode seguir os diversos tutoriais existentes na web e principalmente a própria documentação, não vou entrar em detalhe neste passo).

  • No diretório raiz do projeto deletar a pasta vendor para excluir as dependências. Isso serve para evitar alguns bugs que já tive anteriormente em outras tentativas, mas não se preocupe, elas serão instaladas novamente a partir do container mais pra frente.

  • Na raiz do projeto criar o arquivo docker-compose.yaml com o seguinte conteúdo:

version: '3'
services:
   nginx:
      build: .
      container_name: nginx
      ports:
         - "8080:80"
      volumes:
         - ./:/usr/share/nginx
      networks:
         - app-network
   mysql:
      image: mysql:5.7.22
      container_name: mysql
      ports:
         - "3300:3306"
      volumes:
         - .docker/dbdata:/var/lib/mysql
      environment:
         MYSQL_DATABASE: banco_meuprojeto
         MYSQL_ROOT_PASSWORD: senha_poderosa
      networks:
         - app-network
   networks:
      app-network:
         driver: bridge
Enter fullscreen mode Exit fullscreen mode
  • Ainda na raiz do projeto criar outro arquivo chamado Dockerfile (atentar para a primeira letra maiúscula) com o conteúdo abaixo. Um detalhe importante, a primeira linha estou sugerindo carregar o php 7.0 porque é o que utilizo no projeto que usei como exemplo, porém você pode alterar para a versão que utiliza.
FROM wyveo/nginx-php-fpm:php70
#instalando e limpando cache das dependências linux
RUN apt-get update && apt-get install -y \
    vim \ 
    curl
RUN apt-get clean && rm -Rf /var/lib/apt/lists/*
#Copia configuração do nginx
RUN rm -Rf /etc/nginx/conf.d/default.conf
COPY ./.docker/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
#enviando arquivos para diretórios html e ajustando permissões
RUN rm -rf /usr/share/nginx/html
COPY . /usr/share/nginx
RUN chmod -R 775 /usr/share/nginx/storage/*
#link simbólico para funcionamento do nginx
RUN ln -s /usr/share/nginx/public /usr/share/nginx/html
Enter fullscreen mode Exit fullscreen mode
  • Também na raiz do projeto criar um diretório chamado .docker (com ponto no começo mesmo) e depois dentro dele outro diretório chamado dbdata.

  • Dentro do diretório dbdata adicionar um arquivo chamado .gitignore com apenas um asterisco ( sim, esse cara aqui: * ) dentro dele. Serve apenas para não guardarmos o banco de dados no github.
    Alterar o arquivo .env que está na raiz do projeto ajustando a conexão do banco de dados alterando os parâmetros conforme abaixo (atenção para a porta):

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3300
DB_DATABASE= banco_meuprojeto
DB_USERNAME=root
DB_PASSWORD=senha_poderosa
Enter fullscreen mode Exit fullscreen mode
  • Dentro do diretório .docker crie o diretório nginx e dentro dele o conf.d. Dentro deste último crie o arquivo default.conf com o conteúdo abaixo (vai ficar assim: .docker/nginx/conf.d/default.conf):
server {
    listen 80;
    index index.php index.html;
    root /usr/share/nginx/public;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    location / {
        try_files $uri /index.php?$args;
    }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
Enter fullscreen mode Exit fullscreen mode
  • Agora vamos inicializar os containers. Na raiz do projeto abra o terminal e execute o comando:
docker-compose up -d
Enter fullscreen mode Exit fullscreen mode
  • Agora acesse o container nginx:
docker exec -it nginx bash
Enter fullscreen mode Exit fullscreen mode
  • Já dentro do contêiner do nginx navegue até o diretório e instale as dependências do projeto com os dois comandos abaixo:
cd /usr/share/nginx/
composer install
Enter fullscreen mode Exit fullscreen mode
  • Agora basta rodar as migrations do seu projeto para criação das tabelas do banco de dados ou se não tiver migrations pode acessar o banco de dados utilizando algum SGBD (MySQL Workbench mesmo ou Heidi por exemplo) usando as mesmas configurações do .env (atenção pra porta) e criar as tabelas e carregar os dados necessários (neste caso poderia ser exportado o banco de dados legado em um arquivo sql e importado pelo seu SGBD). Uma observação: como estamos falando de projetos legados pode não existir migrations mas é extremamente recomendável tê-las, aliás, é essencial para vida útil da aplicação.

Pronto agora sua aplicação pode ser utilizada a partir da uri http://localhost:8080

Utilizei algumas vezes essa sugestão de processo e tinha ela documentada aqui, então resolvi compartilhar. Espero que seja útil.

Top comments (0)