Nová Laravel instalace – Docker/Sail, macOS


Autor Pavel Zaněk

7. 8. 2022

Obsah článku

V dnešním článku se podíváme na novou instalaci frameworku Laravel. Již dříve jsme si ukázali postup instalace Laravelu na lokální prostředí pomocí Homestead (Win10). Jelikož jsem si však v průběhu času pořídil Maca (MacBook Pro 16″ / M1 Pro / 16GB – mrk mrk, musím jen a jen doporučit), změnilo se i mé pracovní prostředí. Homestead jsem se rozhodl nahradit za Docker – tedy další způsob, jak využít virtualizované prostředí pro běh webových aplikací.

Ono způsobů, jak si lze spustit Laravel aplikaci na lokálním prostředí je opravdu mnoho. Ať už máte server přímo na daném stroji (implementovaný výchozí server Laravel aplikace, XAMP, …), využíváte Valet či Sail, apod. Jelikož jsem si oblíbil Docker (alespoň základy), rozhodl jsem se osobní projekty spouštět pomocí Sail.

Předpoklady

  • Win 10 a vyšší (možnost využít WSL2)
  • Nainstalovaný Docker Desktop

Ve stručnosti

  1. Zahájíme instalaci MVC frameworku Laravel
  2. Nastavíme soubor hosts
  3. Nastavíme Docker / docker-compose.yml + .env

Zahájení instalace Laravel

Spustíme si terminál, přejdeme do složky, ve které chceme nainstalovat Laravel a spustíme tento příkaz:

curl -s "https://laravel.build/laratest" | bash

Tím dojde ke stažení a instalaci frameworku. Podrobnosti o instalaci, včetně možnosti nastavení služeb už během tohoto příkazu, naleznete v oficiální dokumentaci Laravelu / Sail.

Nová instalace Laravelu
Nová instalace Laravelu

Na konci byste měli vidět info o zdárné instalaci.

Úspěšně dokončená instalace Laravelu
Úspěšně dokončená instalace Laravelu

Můžete si všimnout, že nám v posledním řádku radí, abychom přešli do složky s aplikací a spustili samotnou aplikaci, resp. prostředí pro lokální vývoj. (Ačkoliv jste viděli v příkladu, že jsem aplikaci instaloval do adresáře „laratest“, dále budu pokračovat z adresáře „laravel.laratest.test“ – kvůli dalším nástrojům udržuji určitou konvenci – tedy adresář laratest jsem přejmenoval na laravel.laratest.test).

Nastavení souboru hosts

Opět přejdeme do terminálu a spustíme následující příkaz, který nám dovolí upravit soubor hosts s právy administrátora.

sudo nano /etc/hosts
Úpravu souboru hosts můžeme provést z příkazového řádku
Úpravu souboru hosts můžeme provést z příkazového řádku

Do souboru hosts potřebujeme přidat následující řádek:

...
127.0.0.1 laravel.laratest.test
...

Úpravu uložíme, soubor zavřeme a můžeme pokračovat otevřením Vašeho IDE, v mém případě Visual Studio Code.

Úprava Docker / docker-compose.yml + .env

Nyní, než přejdeme na samotný build aplikace, upravíme docker-compose.yml. Otevřete si tedy aplikaci ve Vašem oblíbeném editoru a podívejme se soubor docker-compose.yml. Měl by vypadat podobně jako níže (Laravel v9.19, Sail v1.0.1, instalace ze 7.8.2022)

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.1
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.1/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
            - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            - redis
            - meilisearch
            - selenium
    mysql:
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: "%"
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 1
        volumes:
            - 'sail-mysql:/var/lib/mysql'
            - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
            retries: 3
            timeout: 5s
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sail-redis:/data'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "redis-cli", "ping"]
            retries: 3
            timeout: 5s
    meilisearch:
        image: 'getmeili/meilisearch:latest'
        ports:
            - '${FORWARD_MEILISEARCH_PORT:-7700}:7700'
        volumes:
            - 'sail-meilisearch:/meili_data'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "wget", "--no-verbose", "--spider",  "http://localhost:7700/health"]
            retries: 3
            timeout: 5s
    mailhog:
        image: 'mailhog/mailhog:latest'
        ports:
            - '${FORWARD_MAILHOG_PORT:-1025}:1025'
            - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
        networks:
            - sail
    selenium:
        image: 'selenium/standalone-chrome'
        volumes:
            - '/dev/shm:/dev/shm'
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sail-mysql:
        driver: local
    sail-redis:
        driver: local
    sail-meilisearch:
        driver: local

Ještě se můžeme podívat na předpřipravený .env soubor.

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:NejakyVasVygenerovanyKlic
APP_DEBUG=true
APP_URL=http://laratest.test

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laratest
DB_USERNAME=sail
DB_PASSWORD=password

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=memcached

REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1

VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://meilisearch:7700

Tedy ve výchozí instalaci vidíme 6 kontejnerů – aplikace, mysql, redis, meilisearch, mailhog a selenium.

Jelikož pár služeb v této aplikaci nevyužiji, maily rovnou budu odesílat skrze Mailgun a MySQL databázi chci nahradit za MariaDB, udělám pár úprav v obou souborech.

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.1
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.1/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
            - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mariadb
            - redis
    mariadb:
        image: 'mariadb:10'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: "%"
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sail-mariadb:/var/lib/mysql'
            - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
            retries: 3
            timeout: 5s
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sail-redis:/data'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "redis-cli", "ping"]
            retries: 3
            timeout: 5s
networks:
    sail:
        driver: bridge
volumes:
    sail-mariadb:
        driver: local
    sail-redis:
        driver: local

Tedy pár služeb jsem odstranil, mysql kontejner jsem nahradil za mariadb. Tudíž je zapotřebí upravit i .env soubor.

APP_NAME=LaraTest
APP_ENV=local
APP_KEY=base64:NejakyVasVygenerovanyKlic
APP_DEBUG=true
APP_URL="http://laravel.laratest.test:8240"
APP_PORT=8240

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=mariadb
DB_PORT=3306
FORWARD_DB_PORT=3390
DB_DATABASE=laratest
DB_USERNAME=sail
DB_PASSWORD=password

BROADCAST_DRIVER=log
CACHE_DRIVER=redis
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=redis
SESSION_LIFETIME=120

MEMCACHED_HOST=memcached

REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
FORWARD_REDIS_PORT=6425

MAIL_MAILER=mailgun
MAIL_USERNAME=TadyByPripadneBylVasMailgunUsername
MAILGUN_DOMAIN=TadyByPripadneBylaVaseMailgunDomena
MAILGUN_SECRET=TadyByPripadneBylVasMailgunSecret
MAIL_PORT=1025
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="info@pavelzanek.com"
MAIL_FROM_NAME="${APP_NAME}"

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1

VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

Do .env jsem si doplnil porty, protože v jeden čas mám spuštěno několik projektů a ty jsou zpravidla zcela odděleny. Zároveň jsem upravil DB_HOST, aby se připojovalo ke kontejneru s mariadb. U cache a sessions rovnou využiji sílu Redisu 🙂

Nyní můžeme projekt vybuildit. To provedeme následujícím příkazem:

sail build --no-cache

Po úspěšném dokončení buildu uvidíte přibližně toto:

Spuštění buildu + úspěšný konec
Spuštění buildu + úspěšný konec

Nyní můžete aplikaci spustit, resp. spustit všechny kontejnery uvedené v docker-compose.yml. To můžete provést například po mocí těchto příkazů – první spustí kontejnery a uvidíte jejich operace, ve druhém případě se spustí kontejnery na pozadí a vy můžete nadále používat terminál.

sail up

sail up -d

Tím tedy spustíte kontejnery a opět při úspěchu uvidíte přibližně toto:

Spuštení kontejnerů
Spuštení kontejnerů

Nyní můžete přejít na URL adresu uvedenou v .env souboru v rámci proměnné „APP_URL“. V mém případě „http://laravel.laratest.test:8240“. Měli byste vidět čerstvou instalaci Laravel frameworku.

Nová instalace Laravelu pomocí Sail
Nová instalace Laravelu pomocí Sail

A tím jsme dokončili instalaci a můžeme vytvářet něco nového. Je důležité si uvědomit, že chcete Artisan příkazy spouštět uvnitř kontejneru s aplikací. Toho můžete docílit tak, že u artisan příkazů nahradíte část „php“ za „sail.“ Tedy například:

php artisan migrate -> sail artisan migrate
php artisan optimize:clear -> sail artisan optimize:clear
composer update -> sail composer update
composer require xyz -> sail composer require xyz

Další články

Autor Pavel Zaněk

Tvořím webové stránky s velkou oblibou v online marketingu - především v odvětví optimalizace pro vyhledávače (SEO). Především se specializuji na tvorbu webových aplikací na míru (PHP framework Laravel s využitím dalších moderních technologií) a na tvorbu webových stránek s použitím redakčního systému Wordpress. Ačkoliv se více zaměřuji na logiku webových aplikací (back end), jsem schopný tvořit i moderní a responzivní šablony v rámci webové grafiky (front end).

7. 8. 2022