Sugestão de como aplicar Docker em projeto Laravel legado
Tags: laravel, docker, beginners
Published: 2020-11-30 14:00:37

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
```

* 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
```

* 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
```

* 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;
    }
}
```

* Agora vamos inicializar os containers. Na raiz do projeto abra o terminal e execute o comando:
```
docker-compose up -d
```

* Agora acesse o container nginx:
```
docker exec -it nginx bash
```

* 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
```

* 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.