Do not speak Portuguese? Translate this site with Google or Bing Translator
Laravel Sail – Ambiente Docker

Posted on: July 10, 2021 11:46 AM

Posted by: Renato

Views: 2804

Laravel Sail – Ambiente Docker para quem nunca viu Docker (e para quem já viu também)

Blog Erik Figueiredo – Dicas para desenvolvedores

Desenvolvedor Fullstack com conhecimentos em Infra, Mobile e Desktop – PHP, Javascript e Flutter

O Laravel Sail é a forma oficial de iniciar um novo projeto Laravel, mas nada impede de você incluí-lo em seu projeto já existente, neste artigo quero falar sobre o que é o Laravel Sail e como ele já se tornou a melhor alternativa de ambiente para mim.

Não se esqueça de assinar a newsletter do blog para ficar por dentro das novidades.

O que é o Laravel Sail

O Laravel Sail é uma interface de linha de comando leve (assim como o artisan) e simples de usar. Seu foco é abstrair todo o uso do Docker para que seja mais simples durante o dia a dia.

Com o Sail é possível executar comandos do PHP, Composer, Node, Tinker , Artisan, rodar testes com o Laravel Dusk e até pré-visualizar e-mails com o MailHog.

Como é construído em Docker, você pode personalizar o ambiente com seu próprio Dockerfile, adicionando tudo o que você quiser, basta saber alterar arquivos do Docker (conhecimento que pode ser adquirido rápidamente, você pode começar por aqui).

Instalando o Docker

Se você não tem o Docker instalado saiba que ele é obrigatório (óbvio), porém é um tanto inviável eu descrever este passo a passo aqui neste momento, já que o processo pode mudar um pouco (muito) de ambiente para ambiente ou até ter várias formas se se fazer

Vou adiantar que Ainda bem que este é um processo MUITO BEM documentado pela internet a fora, recomendo “dar um Google” por “instalar o Docker no [sistema operacional] [versão]”.

Novo projeto Laravel com Laravel Sail

Para iniciar um novo projeto Laravel usando o Sail você só precisa executar um comando.

curl -s https://laravel.build/example-app | bash

Os usuários do Windows 10 (outras versões do Windows não estão contempladas na documentação oficial) vão precisar do Windows Subsystem for Linux 2 (WSL2) instalado, além do Windows Terminal.

Com isso você já irá instalar o Laravel com ambiente Docker e tudo o que tiver direito.

Adicionando o Laravel Sail a um projeto já existente

Para um projeto já existente, tudo o que você precisa é instalar um pacote com Composer e rodar um comando instalador.

Como mencionado assima, aém do Docker, usuários do Windows também irão precisar do Windows Subsystem for Linux 2 (WSL2) instalado, além do Windows Terminal.

composer require laravel/sail --dev
php artisan sail:install

Executando Laravel Sail

Para gerenciar seu ambiente Docker com o Sail é bem simples, basta acessar o ./vendor/bin/sail e em seguida o comando que você precisa executar.

Da até pra criar um alias no Linux utilizando o comando a seguir:

alias sail='bash vendor/bin/sail'

Daí é só acessar a raiz do projeto que possui uma instalação do Laravel Sail e executar:

sail [comando]

O comando para “subir” o ambiente Docker do Laravel Sail é:

sail up

Se você quiser rodar o servidor em background, basta apenas adicionar -d no comando e o terminal ficará liberado para você usar.

sail up -d

Finalmente, para parar o servidor você pode teclar ctrl+c ou, se estiver rodando em background, o comando sail down.

Para acessar o projeto no navegador, basta acessar http://localhost/.

Executando comandos com Laravel Sail (Artisan, PHP, Composer, Node e NPM)

Para executar comandos não muda quase nada, há não ser que todos devem ser precedidos pelo sail, com exceção do artisan que substitui o php.

Exemplos:

sail artisan queue:work
sail php --version
sail composer require laravel/sanctum
sail node --version
sail npm run prod

Um adendo importante é que o sail tem vários pacotes do Composer como dependência, então quando clonar um projeto, não esqueça de fazer a instalação dos pacotes ou Laravel Sail não irá funcionar, para rodar o composer install diretamente no Docker antes de ter um ambiente com Laravel Sail:

docker run --rm \
    -v $(pwd):/opt \
    -w /opt \
    laravelsail/php80-composer:latest \
    composer install

Bancos de dados (MySQL e Redis)

Como temos um ambiente completo, o MySQL e Redis não poderiam faltar e o acesso a isso é bem simplificado.

Quando o Laravel Sail inicia ele garante que um banco de dados com o nome setado na variável de ambiente (.env) DB_DATABASE exista.

Além disso você pode verificar se o DB_HOST contém o valor mysql (é o alias do container usado pelo Docker, como um IP ou domínio) para garantir a conexão.

Para acessar o banco de dados o recomendado é utilizar um cliente com interface gráfica, a documentação oficial sugere o TablePlus, eu gosto do MySQL Workbench e também tem o DBeaver.

Já o Redis, a regra é parecida com o MySQL, você vai precisar garantir que a variável de ambiente REDIS_HOST tem o valor redis.

Parace acessar o Redis, também é recomendado usar um aplicativo externo, a documentação recomenda novamente o TablePlus.

Rodando testes com Laravel Sail

A parte de testes é bem simples, basta trocar php artisan test por sail test.

sail test
sail test --group orders

Além dos testes com PHPUnit, podemos ter acesso ao Laravel Dusk de forma bem simplificada.

Vamos precisar ativar o “service” no docker-compose.yml, quem leu meu artigo anterior sobre Laravel com Docker sem o Laravel Sail sabe do que estou falando.

Para isso basta saber que o arquivo responsável por gerir o ambiente do Sail é o arquivo docker-compose.yml que é publicado quando você usa o comando php artisan sail:install na raiz do projeto.

Todo arquivo yml é organizado por identações, ou seja, o nó services possui o filho laravel.test e o build está dentro do laravel.test, aqui o arquivo na integra, você também pode encontrá-lo na raiz do seu projeto Laravel:

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        ports:
            - '${APP_PORT:-80}:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            # - pgsql
            - redis
            # - selenium
    # selenium:
    #     image: 'selenium/standalone-chrome'
    #     volumes:
    #         - '/dev/shm:/dev/shm'
    #     networks:
    #         - sail
    mysql:
        image: 'mysql:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sailmysql:/var/lib/mysql'
        networks:
            - sail
        healthcheck:
          test: ["CMD", "mysqladmin", "ping"]
#    pgsql:
#        image: postgres:13
#        ports:
#            - '${FORWARD_DB_PORT:-5432}:5432'
#        environment:
#            PGPASSWORD: '${DB_PASSWORD:-secret}'
#            POSTGRES_DB: '${DB_DATABASE}'
#            POSTGRES_USER: '${DB_USERNAME}'
#            POSTGRES_PASSWORD: '${DB_PASSWORD:-secret}'
#        volumes:
#            - 'sailpostgresql:/var/lib/postgresql/data'
#        networks:
#            - sail
#        healthcheck:
#          test: ["CMD", "pg_isready", "-q", "-d", "${DB_DATABASE}", "-U", "${DB_USERNAME}"]
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
        healthcheck:
          test: ["CMD", "redis-cli", "ping"]
    # memcached:
    #     image: 'memcached:alpine'
    #     ports:
    #         - '11211:11211'
    #     networks:
    #         - sail
    mailhog:
        image: 'mailhog/mailhog:latest'
        ports:
            - '${FORWARD_MAILHOG_PORT:-1025}:1025'
            - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
#    sailpostgresql:
#        driver: local
    sailredis:
        driver: local

As linhas com # estão comentadas, o que quer dizer que não estão ativadas, para habilitar o acesso ao Laravel Dusk precisamos descomentar o nó selenium e a linha - selenium dentro de depends_on do service laravel.test, o arquivo final:

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        ports:
            - '${APP_PORT:-80}:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            # - pgsql
            - redis
            - selenium
    selenium:
        image: 'selenium/standalone-chrome'
        volumes:
            - '/dev/shm:/dev/shm'
        networks:
            - sail
    mysql:
        image: 'mysql:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sailmysql:/var/lib/mysql'
        networks:
            - sail
        healthcheck:
          test: ["CMD", "mysqladmin", "ping"]
#    pgsql:
#        image: postgres:13
#        ports:
#            - '${FORWARD_DB_PORT:-5432}:5432'
#        environment:
#            PGPASSWORD: '${DB_PASSWORD:-secret}'
#            POSTGRES_DB: '${DB_DATABASE}'
#            POSTGRES_USER: '${DB_USERNAME}'
#            POSTGRES_PASSWORD: '${DB_PASSWORD:-secret}'
#        volumes:
#            - 'sailpostgresql:/var/lib/postgresql/data'
#        networks:
#            - sail
#        healthcheck:
#          test: ["CMD", "pg_isready", "-q", "-d", "${DB_DATABASE}", "-U", "${DB_USERNAME}"]
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
        healthcheck:
          test: ["CMD", "redis-cli", "ping"]
    # memcached:
    #     image: 'memcached:alpine'
    #     ports:
    #         - '11211:11211'
    #     networks:
    #         - sail
    mailhog:
        image: 'mailhog/mailhog:latest'
        ports:
            - '${FORWARD_MAILHOG_PORT:-1025}:1025'
            - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
#    sailpostgresql:
#        driver: local
    sailredis:
        driver: local

Agora é só digitar sail down e em seguida sail up e pronto, Laravel Dusk disponível.

Para executar os testes do Dusk, basta usa o comando a seguir.

sail dusk

Pré-visualização de email

Os emails dentro do projeto podem ser monitorados e interceptados pelo MailHog, ele já vem configurado, só é necessário configurar o Laravel para usá-lo e isso pode ser feito com 2 linhas no .env.

MAIL_HOST=mailhog
MAIL_PORT=1025

Para ver os emails enviados pelo Laravel acesse o MailHog na seguinte url:

http://localhost:8025

Acessar o Container Docker com Laravel

Pra quem tem mais experiência com Docker e precisa acessar o Container por algum motivo, saiba que isso é outro processo bem simples:

sail shell

Ou se precisar do Tinker:

sail tinker

Outras coisas legais

Ainda existem outras features que o Laravel Sail possui e eu não mostrei aqui, como trocar a versão do PHP, tunelamento (compartilhar um link com a internet) do seu localhost e publicar uma imagem customizada da sua aplicação, para tal de uma olhada na documentação oficial.

https://laravel.com/docs/sail

Conclusão

E é isso ai, Laravel Sail é uma excelente ferramenta para gerir seu ambiente de desenvolvimento e quem sabe até ser o ponta-pé inicial para você migrar de vez para o Docker.

Obrigado por me ler este artigo e até a próxima!

erikfigueiredo

Compartilhe isso:


3

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (16) Variados (109) PHP (133) Laravel (171) Black Hat (3) front-end (29) linux (114) postgresql (39) Docker (28) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (56) devops (25) nodejs (5) npm (3) nvm (1) git (8) firefox (1) react (7) reactnative (5) collections (1) javascript (7) reactjs (8) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (2) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (12) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (5) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (3) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (43) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (2) jwt (5) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (3) Architecture (4) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (2) autorizacao (2) authentication (4) authorization (3) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1) Axios (1) Fetch (1) Deepin (1) vue (4) nuxt (1) PKCE (1) Oauth2 (2) webhook (1) TypeScript (1) tailwind (1) gource (2)

New Articles



Get Latest Updates by Email