Pesquisa de site

Como instalar o Laravel com Docker no Ubuntu 22.04


Laravel é um framework PHP gratuito e de código aberto que fornece um conjunto de ferramentas e recursos para construir aplicativos PHP modernos. Com uma grande variedade de pacotes e extensões compatíveis, o Laravel se tornou popular, com muitos desenvolvedores adotando-o como sua estrutura preferida. O Laravel fornece ferramentas poderosas de banco de dados, incluindo um ORM (Object Relational Mapper) chamado Eloquent e mecanismos integrados para criar migrações de banco de dados. Ele vem com uma ferramenta de linha de comando Artisan, com a qual os desenvolvedores podem inicializar novos modelos, controladores e outros componentes de aplicativo, o que acelera o desenvolvimento geral do aplicativo.

Conteinerizar um aplicativo refere-se ao processo de adaptação de um aplicativo e seus componentes para poder executá-lo em ambientes leves conhecidos como contêineres. Este guia usará o Docker Compose para conteinerizar um aplicativo Laravel para desenvolvimento.

Criaremos três contêineres Docker para nossa aplicação Laravel.

  • Um serviço app executando PHP 8.2-FPM
  • Um serviço db executando MySQL 8.0
  • Um serviço nginx que usa o serviço app para analisar o código PHP antes de servir o aplicativo Laravel ao usuário

Também criaremos um certificado SSL para nosso site Laravel usando Let's Encrypt.

Pré-requisitos

    Um servidor executando Ubuntu 22.04.

    Um usuário não root com privilégios sudo.

    Um nome de domínio totalmente qualificado (FQDN) apontando para o seu servidor. Para nossos propósitos, usaremos example.com como nome de domínio.

    Certifique-se de que tudo esteja atualizado.

    $ sudo apt update
    

    Instale pacotes de utilitários básicos. Alguns deles já podem estar instalados.

    $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
    

Passo 1 - Configurar Firewall

O primeiro passo é configurar o firewall. O Ubuntu vem com ufw (Firewall Descomplicado) por padrão.

Verifique se o firewall está em execução.

$ sudo ufw status

Você deve obter a seguinte saída.

Status: inactive

Permita a porta SSH para que o firewall não interrompa a conexão atual ao ativá-lo.

$ sudo ufw allow OpenSSH

Permita portas HTTP e HTTPS também.

$ sudo ufw allow http
$ sudo ufw allow https

Habilite o Firewall

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Verifique o status do firewall novamente.

$ sudo ufw status

Você deverá ver uma saída semelhante.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Passo 2 – Instalar SSL

Antes de prosseguir, vamos primeiro criar um certificado SSL para nosso domínio. Criaremos isso fora do Docker, pois é fácil de manter. Posteriormente, sincronizaremos os certificados com o contêiner, que será renovado e atualizado regularmente.

Precisamos instalar o Certbot para gerar o certificado SSL. Você pode instalar o Certbot usando o repositório do Ubuntu ou obter a versão mais recente usando a ferramenta Snapd. Estaremos usando a versão Snapd.

Ubuntu 22.04 vem com Snapd instalado por padrão. Execute os seguintes comandos para garantir que sua versão do Snapd esteja atualizada. Certifique-se de que sua versão do Snapd esteja atualizada.

$ sudo snap install core
$ sudo snap refresh core

Instale o Certbot.

$ sudo snap install --classic certbot

Use o comando a seguir para garantir que o comando Certbot seja executado criando um link simbólico para o diretório /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Execute o seguinte comando para gerar um certificado SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d example.com

O comando acima fará download de um certificado para o diretório /etc/letsencrypt/live/example.com em seu servidor.

Gere um certificado do grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Faça uma simulação do processo para verificar se a renovação do SSL está funcionando bem.

$ sudo certbot renew --dry-run

Se você não encontrar erros, está tudo pronto. Seu certificado será renovado automaticamente.

Após configurar o Docker e instalar o Laravel, o processo de renovação precisará ser modificado. Abordaremos isso em uma seção posterior.

Etapa 3 - Instale o Docker e o Docker Compose

O Ubuntu 22.04 vem com uma versão mais antiga do Docker. Para instalar a versão mais recente, primeiro importe a chave Docker GPG.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Crie um arquivo de repositório Docker.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Atualize a lista de repositórios do sistema.

$ sudo apt update

Instale a versão mais recente do Docker.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Verifique se ele está em execução.

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-01-14 10:41:35 UTC; 2min 1s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 2054 (dockerd)
      Tasks: 52
     Memory: 22.5M
        CPU: 248ms
     CGroup: /system.slice/docker.service
             ??  2054 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Por padrão, o Docker requer privilégios de root. Se você quiser evitar o uso de sudo toda vez que executar o comando docker, adicione seu nome de usuário ao grupo docker.

$ sudo usermod -aG docker $(whoami)

Você precisará sair do servidor e fazer login novamente como o mesmo usuário para ativar essa alteração ou usar o seguinte comando.

$ su - ${USER}

Confirme se seu usuário foi adicionado ao grupo Docker.

$ groups
navjot wheel docker

Passo 4 - Baixe o Laravel e instale as dependências

O primeiro passo é baixar a versão mais recente do Laravel e instalar as dependências, incluindo o Composer, o gerenciador de pacotes PHP.

Crie o diretório do aplicativo Laravel.

$ mkdir ~/laravel

Mude para o diretório.

$ cd ~/laravel

Clone a versão mais recente do Laravel no diretório. Não esqueça o . no final do comando, o que significa que o Git irá clonar os arquivos no diretório atual.

$ git clone https://github.com/laravel/laravel.git .

Use a imagem Compose do Docker para montar os diretórios necessários para o seu projeto Laravel. Isso evita a necessidade de instalar o Composer globalmente.

$ docker run --rm -v $(pwd):/app composer install

O comando acima cria um contêiner efêmero que é montado em ligação ao seu diretório atual antes de ser removido. Ele copia o conteúdo do seu diretório Laravel para o contêiner e garante que a pasta vendor que o Composer cria dentro do contêiner seja copiada de volta para o diretório atual.

Defina permissões no diretório Laravel para que ele pertença ao usuário logado no momento.

$ sudo chown -R $USER:$USER ~/laravel

Etapa 5 - Crie o arquivo Docker Compose

Crie e abra o arquivo de composição do Docker para edição.

$ nano docker-compose.yml

Cole o seguinte código nele. Aqui, definimos três serviços: app, webserver e db. Substitua MYSQL_ROOT_PASSWORD no serviço db por uma senha forte de sua escolha.

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: howtoforge/app
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - app-network

  webserver:
    container_name: webserver
    image: nginx:alpine
    restart: unless-stopped
    tty: true
    ports:
        - 80:80
        - 443:443
    volumes:
        - ./:/var/www
        - ./nginx/conf.d:/etc/nginx/conf.d
        - ./nginx/logs:/var/log/nginx
        - /etc/ssl/certs/dhparam.pem:/etc/ssl/certs/dhparam.pem
        - /etc/letsencrypt:/etc/letsencrypt
    logging:
        options:
            max-size: "10m"
            max-file: "3"
    networks:
      - app-network

  db:
    image: mysql:latest
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD
      MYSQL_USER: laraveluser
      MYSQL_PASSWORD: password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - dbdata:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - app-network

volumes:
  dbdata:
    driver: local

networks:
  app-network:
    driver: bridge

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Vamos examinar os serviços em detalhes.

  • app - Este serviço define a aplicação Laravel e executa uma imagem Docker do cliente intitulada howtoforge/app. Criaremos esta imagem na próxima etapa. O diretório de trabalho do Laravel dentro do contêiner é definido em /var/www que é mapeado para o diretório atual no host. Também montamos um arquivo de configuração PHP que é copiado para o contêiner PHP. Iremos configurar isso em uma etapa posterior.
  • webserver - Este serviço cria um contêiner usando a imagem Nginx Docker e expõe as portas 80 e 443 ao host. Também montamos volumes para logs Nginx, configuração personalizada, diretório de aplicativos Laravel e certificados SSL.
  • db - Este serviço cria um contêiner usando a imagem MySQL Docker e define variáveis de ambiente configurando o nome do banco de dados e a senha root do MySQL. Você pode nomear o banco de dados como quiser e substituir MYSQL_ROOT_PASSWORD por uma senha forte de sua escolha. Além disso, defina o nome de usuário do MySQL (MYSQL_USER_NAME) e a senha (MYSQL_USER_PASSWORD) que terão acesso ao banco de dados que você escolheu. Este serviço também mapeia a porta 3306 do contêiner para a porta 3306 no host. Também ligamos o volume de montagem para configuração personalizada do MySQL e um volume local para dados do MySQL. Isso permite reiniciar o serviço db sem perder os dados.

Para fazer com que os serviços se comuniquem entre si, criamos uma rede Docker chamada app-network . Está definido como uma rede bridge. Ele permite que os contêineres conectados a ele se comuniquem entre si. O driver de rede bridge instala regras na máquina host para que contêineres em diferentes redes bridge não possam se comunicar diretamente entre si.

Passo 6 – Crie o Dockerfile

Um Dockerfile é usado para criar imagens personalizadas. Não existe uma imagem padrão para o Laravel, por isso precisamos definir um Dockerfile para criar uma imagem personalizada para o Laravel. Ele contém comandos para instalar pacotes e configurar o ambiente Linux dependendo das necessidades do seu aplicativo. Você também pode publicar sua imagem personalizada no Docker Hub ou em qualquer registro privado do Docker. Você pode saber mais em nosso Tutorial do Dockerfile.

Crie e abra o Dockerfile para edição.

$ nano Dockerfile

Cole o seguinte código nele.

FROM php:8.2-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    libzip-dev \
    unzip \
    git \
    curl \
    libonig-dev

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg
RUN docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Copy existing application directory contents to the working directory
COPY . /var/www

# Assign permissions of the working directory to the www-data user
RUN chown -R www-data:www-data \
        /var/www/storage \
        /var/www/bootstrap/cache

# Assign writing permissions to logs and framework directories
RUN chmod 775 storage/logs \
        /var/www/storage/framework/sessions \
        /var/www/storage/framework/views

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Vamos ver o que está acontecendo aqui. Primeiro, criamos nossa imagem personalizada sobre a imagem Docker php:8.2-fpm. Esta é uma imagem baseada em Debian que possui PHP 8.2-FPM instalado. O Dockerfile usa várias diretivas para realizar operações, a diretiva RUN especifica os comandos para atualizar, instalar e definir configurações dentro do contêiner, a diretiva COPY para copiar arquivos para o contêiner, COPY para copiar arquivos para o contêiner, COPY diretivaEXPOSE para expor uma porta no contêiner e diretiva CMD para executar um comando.

Primeiro, copiamos os arquivos do Composer do diretório Laravel no host dentro do contêiner para o diretório /var/www. Também definimos o diretório de trabalho do contêiner como /var/www. Em seguida, instalamos vários pré-requisitos e pacotes necessários para o funcionamento do Laravel, incluindo extensões PHP, incluindo mbstring, gd, exif, zip, pdo_mysql e pcntl. Em seguida, instalamos o gerenciador de pacotes Composer.

A seguir, copiamos todos os arquivos do diretório Laravel para o contêiner e definimos permissões no diretório de trabalho para o usuário www-data. Este é o usuário que o PHP usa por padrão na plataforma Debian. A seguir, definimos permissões de gravação corretas para os logs, sessões e diretórios de visualizações do Laravel.

E por fim, expomos a porta 9000 para o serviço PHP-FPM que será utilizado pelo servidor Nginx, e executamos o comando PHP para iniciar o container.

Passo 7 – Configurar PHP

Crie o diretório PHP.

$ mkdir ~/laravel/php

Crie e abra o arquivo local.ini para edição.

$ nano local.ini

Cole o seguinte código nele.

upload_max_filesize=40M
post_max_size=40M

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado. Estas diretivas definem o tamanho máximo dos arquivos carregados. Altere o valor conforme suas necessidades. Você pode colocar qualquer configuração específica do PHP para substituir as diretivas padrão.

Etapa 8 – Configurar o Nginx

Crie o diretório Nginx para a configuração do site.

$ mkdir ~/laravel/nginx/conf.d -p

Precisamos criar um arquivo de configuração Nginx para usar PHP-FPM como servidor FastCGI para servir o Laravel.

Crie e abra o arquivo app.conf para edição.

$ nano ~/laravel/nginx/conf.d/app.conf

Cole o seguinte código nele.

server {
    # Redirect any http requests to https
    listen 80;
    listen [::]:80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    index index.php index.html;

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    root /var/www/public;
    client_max_body_size 40m;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_ecdh_curve secp384r1;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

O arquivo acima configura o Nginx para servir versões HTTP e HTTPS do site Laravel e redirecionar qualquer solicitação HTTP para HTTPS automaticamente. Certifique-se de que o valor da variável client_max_body_size corresponda ao tamanho de upload definido na etapa anterior.

No bloco de localização do PHP, a diretiva fastcgi_pass especifica que o serviço app está escutando em um soquete TCP na porta 9000. O servidor PHP-FPM também pode escutar em um soquete Unix que tem uma vantagem sobre um soquete TCP. Mas não funciona se os serviços estiverem sendo executados em hosts diferentes, o que é o caso aqui, pois o contêiner app está sendo executado em um host diferente do seu contêiner webserver.

Passo 9 – Configurar MySQL

Configuraremos o MySQL para habilitar o log de consulta geral e especificar o arquivo de log correspondente.

Crie o diretório MySQL.

$ mkdir ~/laravel/mysql

Crie e abra o arquivo my.cnf para edição.

$ nano ~/laravel/my.cnf

Cole o seguinte código nele.

[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Passo 10 - Configurando o Arquivo de Ambiente

Agora que criamos e configuramos todos os serviços, é hora de iniciar os containers. Mas antes de fazermos isso, precisamos configurar as variáveis de ambiente do Laravel. O Laravel vem com um arquivo de ambiente padrão, .env.example.

Crie uma cópia do arquivo de ambiente de exemplo.

$ cp .env.example .env

Abra o arquivo .env para edição.

$ nano .env

Encontre o bloco começando com DB_CONNECTION e atualize os valores das variáveis de acordo com suas necessidades.

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password

O valor do DB_HOST será o serviço db. O DB_NAME, DB_USERNAME e DB_PASSWORD serão o nome do banco de dados, nome de usuário e senha que você escolheu na etapa 4 no arquivo de composição do Docker.

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Passo 11 - Inicie os Containers e conclua a instalação do Laravel

Finalmente é hora de iniciar os contêineres.

$ docker compose up -d

Este comando, quando executado pela primeira vez, extrairá as imagens Nginx, MySQL e criará a imagem app usando o Dockerfile nós criamos. Assim que o processo for concluído, você pode verificar o status de seus contêineres usando o seguinte comando.

$ docker ps

Você verá uma saída semelhante.

CONTAINER ID   IMAGE            COMMAND                  CREATED       STATUS       PORTS                                                                      NAMES
a57be976c0fa   mysql:latest     "docker-entrypoint.s…"   6 hours ago   Up 6 hours   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                       db
85e515c4a404   howtoforge/app   "docker-php-entrypoi…"   6 hours ago   Up 6 hours   9000/tcp                                                                   app
8418bbc83bd3   nginx:alpine     "/docker-entrypoint.…"   6 hours ago   Up 6 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   webserver

Assim que os contêineres estiverem em execução, é hora de terminar a instalação do Laravel usando o comando docker compose exec para executar comandos dentro do contêiner.

Gere uma chave de aplicativo e copie-a para o arquivo .env para proteger as sessões do usuário e criptografar os dados do usuário.

$ docker compose exec app php artisan key:generate

Crie o cache do aplicativo Laravel.

$ docker compose exec app php artisan config:cache

Este comando carregará as definições de configuração no arquivo /var/www/bootstrap/cache/config.php.

Visite https://example.com em seu navegador e você verá a seguinte página indicando a instalação bem-sucedida do Laravel.

Passo 12 – Configurar renovação SSL

Agora que o site Laravel está ativo, é hora de revisitar as configurações de SSL para configurar a renovação. Para isso, precisaremos criar scripts para parar o serviço webserver antes de iniciar a renovação e reiniciar o serviço assim que o certificado for renovado. Certbot fornece dois ganchos, pre_hook e post_hook para essa finalidade.

Crie o diretório SSL para armazenar os scripts.

$ mkdir ~/laravel/ssl

Crie o script server-stop.sh.

$ sh -c 'printf "#!/bin/sh\ndocker stop webserver\n" > ~/laravel/ssl/server-stop.sh'

Crie o script server-start.sh.

$ sh -c 'printf "#!/bin/sh\ndocker start webserver\n" > ~/laravel/ssl/server-start.sh'

Torne os scripts executáveis.

$ chmod +x ~/laravel/ssl/server-*.sh

Agora precisamos dizer ao Certbot para usar esses scripts. Abra o arquivo /etc/letsencrypt/renewal/example.com.conf para edição.

$ sudo nano /etc/letsencrypt/renewal/example.com.conf

Cole as seguintes linhas no final do arquivo.

pre_hook = /home/<username>/laravel/ssl/server-stop.sh
post_hook = /home/<username>/laravel/ssl/server-start.sh

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Teste o processo de renovação do certificado fazendo uma simulação.

$ sudo certbot renew --dry-run

Você obterá uma saída semelhante confirmando o sucesso.

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Hook 'pre-hook' ran with output:
 webserver
Simulating renewal of an existing certificate for example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/example.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Hook 'post-hook' ran with output:
 webserver

Seus certificados SSL agora serão renovados automaticamente e usados pelo contêiner Docker para atender sua aplicação Laravel.

Passo 13 - Migração de Dados e Console Tinker

Agora que o aplicativo está em execução, você pode migrar seus dados e experimentar o comando tinker. Tinker é um REPL (Read-Eval-Print Loop) para Laravel. O comando tinker inicia um console PsySH com o Laravel pré-carregado. PsySH é um console de desenvolvedor em tempo de execução e um depurador interativo para PHP. O comando tinker permite interagir com a aplicação Laravel a partir da linha de comando em um shell interativo.

Teste a conexão MySQL usando o comando artisan migrate no contêiner. Ele criará uma tabela migrações no banco de dados.

$ docker compose exec app php artisan migrate

Você obterá a seguinte saída.

 INFO  Preparing database.

  Creating migration table .............................................................................................. 32ms DONE

 INFO  Running migrations.

  2014_10_12_000000_create_users_table .................................................................................. 184ms DONE
  2014_10_12_100000_create_password_resets_table ......................................................................... 259ms DONE
  2019_08_19_000000_create_failed_jobs_table ............................................................................ 102ms DONE
  2019_12_14_000001_create_personal_access_tokens_table .................................................................. 46ms DONE

Em seguida, inicie o console PsySH usando o comando tinker.

$ docker compose exec app php artisan tinker

Você receberá o seguinte prompt.

Psy Shell v0.11.10 (PHP 8.2.1 — cli) by Justin Hileman
>

Teste a conexão MySQL obtendo os dados que você acabou de migrar executando o seguinte comando no prompt do console.

> \DB::table('migrations')->get();

Você obterá a seguinte saída.

= Illuminate\Support\Collection {#3670
    all: [
      {#3679
        +"id": 1,
        +"migration": "2014_10_12_000000_create_users_table",
        +"batch": 1,
      },
      {#3681
        +"id": 2,
        +"migration": "2014_10_12_100000_create_password_resets_table",
        +"batch": 1,
      },
      {#3682
        +"id": 3,
        +"migration": "2019_08_19_000000_create_failed_jobs_table",
        +"batch": 1,
      },
      {#3683
        +"id": 4,
        +"migration": "2019_12_14_000001_create_personal_access_tokens_table",
        +"batch": 1,
      },
    ],
  }

Digite exit para sair do console.

> exit
   INFO  Goodbye.

Você pode usar tinker para interagir com seus bancos de dados e experimentar serviços e modelos. Agora você pode começar a usar o Laravel para desenvolvimento adicional.

Conclusão

Isso conclui nosso tutorial, onde você conteinerizou e instalou o aplicativo Laravel usando Docker, MySQL e PHP. Você também serviu o aplicativo em um nome de domínio seguro. Se você tiver alguma dúvida, poste-a nos comentários abaixo.

Artigos relacionados: