Conteinerizar um aplicativo se refere ao processo de adaptar um aplicativo e seus componentes com a finalidade de conseguir executá-lo em ambientes leves, conhecidos como contêineres. Esses ambientes são isolados e descartáveis e podem ser aproveitados para desenvolver, testar e implantar aplicativos para a produção.
Neste guia, usaremos o Docker Compose para conteinerizar um aplicativo Laravel para o desenvolvimento. Quando você tiver terminado, terá um aplicativo de demonstração Laravel funcionando em três contêineres de serviço separados:
app
executando o PHP7.4-FPM;db
executando o MySQL 5.7;nginx
que usa o serviço de app
para analisar o código PHP, antes de entregar o aplicativo Laravel para o usuário final.Para permitir um processo de desenvolvimento simplificado e facilitar a depuração do aplicativo, manteremos os arquivos do aplicativo sincronizados, usando volumes compartilhados. Também veremos como usar os comandos do docker-compose exec
para executar o Composer e o Artisanno contêiner do app
.
Para começar, iremos buscar o aplicativo de demonstração do Laravel a partir de seu repositório do GitHub. Estamos interessados na ramificação tutorial-01
, que contém o aplicativo básico do Laravel que criamos no primeiro guia dessa série.
Para obter o código do aplicativo compatível com este tutorial, baixe a versão tutorial-1.0.1
para seu diretório home com:
cd ~
curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip
Vamos precisar do comando unzip
para descompactar o código do aplicativo. Caso não tenha instalado este pacote antes, faça isso agora com:
sudo apt update
sudo apt install unzip
Agora, descompacte o conteúdo do aplicativo e renomeie o diretório descompactado para ter um acesso mais fácil:
unzip travellist.zip
mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo
Navegue até o diretório travellist-demo
:
cd travellist-demo
No próximo passo, vamos criar um arquivo de configuração .env
para configurar o aplicativo.
.env
do aplicativoOs arquivos de configuração do Laravel estão localizados em um diretório chamado config
, dentro do diretório raiz do aplicativo. Além disso, um arquivo .env
é usado para preparar a configuração dependente do ambiente, como credenciais e quaisquer informações que possam variar entre as implantações. Este arquivo não está incluído no controle de revisão.
Aviso: o arquivo de configuração de ambiente contém informações confidenciais sobre o seu servidor, incluindo credenciais para o banco de dados e chaves de segurança. Por esse motivo, nunca compartilhe este arquivo publicamente.
Os valores contidos no arquivo .env
terão precedência sobre os valores definidos nos arquivos de configuração regulares, localizados no diretório config.
Cada instalação em novo ambiente exige um arquivo de ambiente personalizado para definir coisas como as configurações da conexão com o banco de dados, as opções de depuração, o URL do aplicativo, entre outros itens que possam variar, dependendo do ambiente em que o aplicativo esteja funcionando.
Agora, vamos criar um novo arquivo .env
para personalizar as opções de configuração do ambiente de desenvolvimento que estamos preparando. O Laravel vem com um exemplo do arquivo .env
que podemos copiar para criar o nosso:
cp .env.example .env
Abra este arquivo usando o nano
ou outro editor de texto de sua escolha:
nano .env
O arquivo .env
atual do aplicativo demo travellist
contém as configurações para usar um banco de dados local do MySQL, com o 127.0.0.1
como o host do banco de dados. Precisamos atualizar a variável DB_HOST
para que ela aponte para o serviço de banco de dados que vamos criar em nosso ambiente do Docker. Neste guia, vamos chamar nosso serviço de banco de dados de db
. Vá em frente e substitua o valor listado de DB_HOST
pelo nome do serviço de banco de dados:
.env
APP_NAME=Travellist
APP_ENV=dev
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password
...
Caso queira, sinta-se à vontade para alterar o nome do banco de dados, nome de usuário e senha. Essas variáveis serão aproveitadas em um próximo passo, onde iremos definir o arquivo docker-compose.yml
para configurar nossos serviços.
Salve o arquivo quando terminar de editar. Caso tenha utilizado o nano
, faça isso pressionando Ctrl+x
, e então Y
e Enter
para confirmar.
Embora ambos os nossos serviços do MySQL e do Nginx se baseiem em imagens padronizadas, obtidas a partir do Docker Hub,ainda precisaremos compilar uma imagem personalizada para o contêiner do aplicativo. Criaremos um novo Dockerfile para isso.
Nossa imagem do travellist irá basear-se na imagem oficial do PHP, php:7.4-fpm
do Docker Hub. Além desse ambiente básico do PHP-FPM, instalaremos alguns módulos adicionais do PHP e a ferramenta de gerenciamento de dependência do Composer.
Também iremos criar um novo usuário do sistema; isso é necessário para executar comandos do artisan
e do composer
durante o desenvolvimento do aplicativo. A configuração uid
garante que o usuário dentro do contêiner tenha o mesmo uid que seu usuário do sistema em sua máquina do host, para o qual está executando o Docker. Desta forma, quaisquer arquivos criados por esses comandos são replicados no host com as permissões corretas. Isso também significa que você poderá usar o editor de códigos de sua escolha no computador host para desenvolver o aplicativo que está executando dentro dos contêineres.
Crie um novo Dockerfile com:
nano Dockerfile
Copie os seguintes conteúdo para seu Dockerfile:
Dockerfile
FROM php:7.4-fpm
# Arguments defined in docker-compose.yml
ARG user
ARG uid
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
# Set working directory
WORKDIR /var/www
USER $user
Não se esqueça de salvar o arquivo quando terminar.
Nosso Dockerfile começa pela definição da imagem base que estamos usando: php:7.4-fpm
.
Após instalar os pacotes do sistema e as extensões do PHP, instalaremos o Composer, copiando o executável composer
de sua última imagem oficial para nossa imagem do aplicativo.
Então, um novo usuário do sistema é criado e configurado usando os argumentos user
e uid
que foram declarados no início do Dockerfile. Esses valores serão injetados pelo Docker Compose no momento da compilação.
Por fim, definimos o dir padrão em funcionamento como /var/www
e trocamos para o usuário recém criado. Isso garantirá que, ao executar os comandos do composer
e do artisan
no contêiner do aplicativo, você esteja se conectando como um usuário comum e que esteja no diretório correto.
#laravel #conteinerizar #conhecidos