Lumen em Container Docker – tutorial

Neste tutorial veremos como instalar o Lumen em um container Docker para ser usado como ambiente de desenvolvimento de aplicações que usem este micro framework.

Este texto foi criado originalmente para o livro que estou escrevendo intitulado: Desenvolvendo API usando o Lumen , porém é um conhecimento valioso que poderá auxiliar você em outros projetos.

O primeiro passo é instalar o Docker, no entanto esta atividade não será descrita em detalhes neste texto devido ao fato de se tratar de procedimentos específicos para cada ambiente e sistema operacional.

As instruções de instalação detalhadas para cada sistema operacional podem ser obtidas no site oficial do Docker acessando o link abaixo:

https://docs.docker.com/get-docker/

Assim sendo, vamos assumir que você já realizou com sucesso a instalação do Docker em seu computador e descrever apenas a parte referente a criação do container Lumen.




docker-compose.yaml

A primeira etapa para criar um Docker container com o Lumen será produzir um arquivo docker-compose.yaml descrevendo o container que desejamos que seja criado.

Para isto crie uma pasta para o projeto e nela o arquivo de nome docker-compose.yaml , em seguida digite no mesmo o seguinte conteúdo:

version: "3.7"

services:
    php:
        image: php:7.4-fpm  
        container_name: php-fpm
        volumes:
            - ./:/src
        command: /src/install.sh
        ports:
            - 8000:8000

Note que nos arquivos YAML a indentação, espaçamento entre as declarações, é importante e faz diferença, podendo inclusive gerar erros caso não seja respeitada.

Examinado as declarações acima, vemos que elas fazem o seguinte:

  • image: define a imagem a qual o container utilizará como base, que neste caso é a php versão 7.4‑fpm;
  • container-name: define o nome que será dado ao container, trata-se de um nome interno ao Docker que apenas poderá ser referenciado por outros container dentro deste mesmo projeto;
  • volumes: estabelecem um mapeamento entre uma pasta local, no seu computador, e uma pasta dentro do container. Em nosso exemplo a pasta do projeto, na qual estão sendo criados os arquivos de configuração e executados os comandos, referenciada pelo ./ e a pasta /src localizada no container.
  • command: indica um comando que deverá ser executado após a inicialização do container. Utilizaremos o arquivo install.sh contendo comandos para instalar software adicionais. Este arquivo será criado na próxima seção.
  • ports: estabelece um mapeamento entre uma porta do computador local e uma porta pertencente ao container. É graças a este mapeamento que será possível utilizar a URL http://localhost:8000 para acessar o aplicativo que está executando dentro do container.

Necessitaremos instalar alguns softwares adicionais para que nosso aplicativo funcione no container definido acima.

Entre eles: o GIT, um utilitário ZIP, o banco de dados SQLite e o Composer.

Desta forma, em seguida iremos criar um arquivo com os comandos que irão executar esta instalação.

install.sh

Ainda na pasta do projeto crie um arquivo com o nome install.sh e nele digite o seguinte:

apt update
apt install -y git
apt install -y zip
apt install -y sqlite
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
mv composer.phar /usr/local/bin/composer
composer create-project -n --prefer-dist laravel/lumen /src/petshop-api
php -S 0.0.0.0:8000 -t /src/petshop-api/public

Este arquivo será processado durante a ativação do container, ocasião em que os comandos acima serão executados.

Assim, vamos agora examinar o que faz cada um dos comandos listados acima.

Na primeira linha será feita a atualização da base de dados do software apt, utilizado por alguns sistemas Linux para instalar aplicativos.

As duas linhas seguintes realizam, respectivamente, a instalação do Git e do Zip, pois ambos os utilitários serão usados pelo Composer para criar o projeto Lumen.

Neste exemplo optamos por configurar o container para que seja usado o SQLite como banco de dados pela facilidade de configuração, de forma que na quarta linha é feita a instalação do SQLite no container.

As próximas linhas: cinco, seis e sete; são responsáveis pela instalação no modo global, acessível de qualquer local, do software Composer, que é um gerenciador de dependências para projetos de software.

Na linha seguinte, oitava, é utilizado composer para criar o projeto e instalar o Lumen.

A última linha faz com que seja ativado o web server embutido do PHP que responderá na porta 8000 do container, a qual foi mapeada para a 8000 do localhost.

Ativando o container

Após criar os dois arquivos conforme descrito acima, para ativar o container, ainda na pasta do projeto, digite o seguinte comando:

docker-compose up -d

Concluída esta etapa, caso a configuração tenha sido bem sucedida, após alguns minutos será possível acessar o site padrão do Lumen apontando o navegador para a URL abaixo:

http://localhost:8000

A figura abaixo ilustra a tela que é esperada durante o acesso no browser:

lumen-docker-tela-inical




Inicialização

Na primeira vez em que você executar o comando docker-compose up -d, descrito acima, é normal que ocorra uma demora na ativação do container. Isso se deve ao fato de que o Docker irá buscar na Internet todas as imagens e arquivos necessários para que o container seja ativado.

Em execuções posteriores o processo será muito mais rápido, porque os arquivos necessários já estarão em seu computador, contudo ainda haverá um tempo de espera devido ao processamento dos comandos contidos no arquivo de configuração

Porém, caso haja demora excessiva ou seja exibido algum erro durante o processo de inicialização e em virtude disto você não consiga visualizar a tela acima, revise todos os passos e os arquivos de configuração, prestando atenção especial na indentação do arquivo docker-compose.yaml.

Executando o Artisan

Um aspecto muito importante no desenvolvimento de aplicações Laravel e Lumen é a possibilidade de executar o comando php artisan, pois é por meio dele que serão executadas muitas das atividades relacionadas com geração de código nestes frameworks.

Existem pelo menos duas formas de executar este comando quando trabalhamos com containers Docker, uma delas é acessando a linha de comando (CLI) do container através do dashboard, conforme a ilustração abaixo.

lumen-docker-container-cli

Acionado esta opção será exibida uma interface de linha de comando onde deverão ser executados os comandos:

cd /src/petshop-api
php artisan list

Os comandos acima servem para, respectivamente, posicionar a CLI na pasta do projeto e executar o php artisan para listar os comandos disponíveis.

Uma outra maneira de executar o php artisan é utilizar o comando docker exec conforme a sintaxe abaixo:

docker exec -w work-dir container-name command

Examinado a sintaxe podemos ver que o parâmetro -w especifica uma pasta (work dir) localizada dentro do container. O nome deste também é especificado pelo parâmetro container-name e, por último, informa-se qual o comando a ser executado.

Para um exemplo do funcionamento deste comando, assumindo que você está em um ambiente Windows e utilizando o prompt de comando, digite a linha abaixo:

docker exec -w /src/petshop-api php-fpm php artisan list

Sugestão: artisan.bat

Prefiro esta última abordagem: utilizar o docker exec, de forma que minha sugestão é que você crie um script, ou arquivo de lotes, que irá executar o comando com os parâmetros informados.

Como ponto de partida pode criar na pasta do projeto o arquivo artisan.bat, mais uma vez assumo que está usando o sistema Windows, e nele digitar o seguinte código:

@echo off
if "%1"=="" goto no_params
docker exec -w /src/petshop-api php-fpm php artisan %1 %2 %3 %4
goto fim
:no_params
docker exec -w /src/petshop-api php-fpm php artisan list
:fim

Para usar este script deve digitar um comando na forma:

artisan.bat <parâmetros>

O funcionamento do script de forma resumida é: caso não seja passado nenhum parâmetro será executado o php artisan list, que irá listar os parâmetros possíveis. Caso sejam passados parâmetros irá executar o php artisan usando os parâmetros informados.

Para testar o funcionamento digite a linha de comando abaixo:

artisan.bat

Deverá se exibida uma tela semelhante a ilustrada abaixo:

lumen-docker-php-artisan

Pasta petshop-api

Observe que após a ativação do container Docker que definimos neste texto, na pasta raiz do projeto haverá agora uma sub pasta de nome petshop-api e é nela que estão localizados os arquivos fonte da aplicação que será desenvolvida.

Algumas considerações

Usando este método não será necessário executar manualmente o comando que ativa o servidor web PHP embutido, pois isto será feito de forma automática durante a inicialização do container.

Sempre finalize o container usando o comando abaixo:

docker-compose down

O conteúdo da pasta que conterá os arquivos fontes, neste exemplo petshop-api, será mantido mesmo depois da destruição do container.

Com isto concluímos este post relativamente curto, mas com um conteúdo útil para auxiliar você em seus projetos que utilizem o Lumen.

Espero que tenha gostado! Até um próximo post.

Leia também

Como instalar a máquina virtual Laravel Homestead