2022-06-24-09-06-26-laravel-docker-i-sail-jak-wydajnie-tworzyc-srodowiska-programistyczne.png

Laravel, Docker i Sail - jak tworzyć wydajnie środowiska programistyczne

Docker jest wspaniałym narzędziem do stawiania różnego rodzaju środowisk testerskich czy przedprodukcyjnych. Ale zwykle stawianie aplikacji za pomocą Dockera bywa skomplikowane. Całe szczęście programistom Laravela na pomoc przychodzi pakiet Sail.

Nasz blog może się rozwijać dzięki naszym sponsorom. Nasz kurs dockera powstał dzięki współpracy z chmurami Vultr i tam dokładnie został przetestowany. Nasz szablon pochodzi z Envato MarketPlace. Wszystkie pluginy i elementy stron internetowych, jakie opisujemy, pochodzą z Envato Elements. Wszystkie książki, opisane na tym blogu, są dostepne u wydawcy Helion. Jesteśmy także partnerem Respondent.io, platformy, która płaci za testowanie aplikacji.

Docker jest narzędziem, które służy do tworzenia kontenerów, w jakich można uruchamiać aplikacje. Oprogramowanie to tworzy kontenery do opakowania danej aplikacji, dzięki czemu praktycznie każda aplikacja może działać płynnie w dowolnym środowisku lub systemie operacyjnym i nie potrzeba do tego żadnej specjalnej konfiguracji.

Zapraszamy do zakupienia naszego szkolenia z dockera: https://hardcorowy-docker.pl. Krzysztof Godzisz zajmuje się cyberbezpieczeństwem oraz serwerami od 2010 roku. Od 2021 jest badaczem, którego artykuły publikujemy na naszym blogu. Pomimo codziennej pracy w zupełnie innej dziedzinie i wykonywaniu obowiązków domowych co dzień w wieczór, od kilkunastu lat poszerza wiedzę w tym zakresie. W związku z ogromnym zamiłowaniem do hakingu stworzył stronę noishacking.pl na której dzieli się poznaną wiedzą. Na nasze zlecenie opracował niesamowity kurs dockera, który od podstaw pozwala przyjrzeć się jak działa to oprogramowanie oraz jak tworzyć środowiska przy pomocy Dockera i kontenerów.

Ale stawianie aplikacji za pomocą Dockera może być skomplikowane, a więc z pomocą przychodzi nam narzędzie o nazwie Sail. Sail zapewnia każdej aplikacji, napisanej w Laravelu, pełne środowisko programistyczne. Dzięki temu nie trzeba tworzyć ręcznie żadnej konfiguracji Dockera. Zasadniczo Sail zapewnia wszystko, co jest potrzebne do stworzenia działającej aplikacji, wraz z odpowiednim oprogramowaniem, takim jak PHP, MySQL, czy Redis, chociaż można wybrać lub dodać określone usługi. A więc jak widzicie, Sail znacząco przyspiesza proces developmentu, ponieważ nie musicie stawiać od zera serwerów, baz danych, czy innych rozwiązań.

Kolejną zasadniczą zaletą oprogramowania Sail jest to, że programista nie musi się martwić, czy ma zainstalowane odpowiednie wersje oprogramowania. Jeśli używamy oprogramowania Sail i mamy problem z kompatybilnością, możemy po prostu usunąć kontener i stworzyć nowy i to wszystko nie zajmie nam dużo czasu.

W sumie praca grupowa nad projektami, to coś do czego Sail został wręcz stworzony. Dzięki temu rozwiązaniu uruchamianie i udostępnianie swojego środowiska jest banalnie proste i programiści nie muszą się martwić systemami operacyjnymi, czy wersjami oprogramowania, jakich używają. Sail doskonale współpracuje także z innymi rozwiązaniami dedykowanymi dla Laravela.

Cały pakiet składa się tak naprawdę z dwóch plików, a mianowicie pliku docker-compose.yml, który zawiera kontenery Dockera oraz skryptu Sail, który udostępnia interfejs wiersza poleceń, aby można było szybko przejść do interakcji z kontenerami Dockera. Plik docker-compose.yml znajduje się w katalogu głównym projektu, natomiast sam Sail znajduje się w katalogu ./vendor/bin.

Zakładam, że macie zainstalowanego Dockera

Tak naprawdę jedynym wymaganiem do używania oprogramowania Sail jest zainstalowanie oprogramowania Docker w waszym systemie operacyjnym. Jeśli nie posiadacie zainstalowanego dockera, to zapraszam Was do innego artykułu, gdzie to omówiłem. Do korzystania z oprogramowania Sail nie jest potrzebne doświadczenie w Dockerze.

Instalacja oprogramowania Sail

Tak naprawdę można stworzyć pudełkową aplikację Laravela z Sailem. Wystarczy jedno polecenie, aby to zrobić:

root@docker-sample:~# curl -s https://laravel.build/new-sail-application | bash

Następnie przechodzimy do katalogu z naszym projektem:

root@docker-sample:~# cd new-sail-application/

I uruchamiamy naszą aplikację:

root@docker-sample:~/new-sail-application# ./vendor/bin/sail up
Creating network "new-sail-application_sail" with driver "bridge"
Creating volume "new-sail-application_sail-mysql" with local driver
Creating volume "new-sail-application_sail-redis" with local driver
Creating volume "new-sail-application_sail-meilisearch" with local driver
Pulling mysql (mysql/mysql-server:8.0)...

Proste, prawda? Ale co mamy zrobić, jeśli posiadamy już istniejącą aplikację? To także nie jest trudne. Najpierw wydajemy polecenie w katalogu projektu:

root@docker-sample:~/new-sail-application# composer require laravel/sail –dev

A następnie publikujemy pliki konfiguracyjne oprogramowania Sail:

root@docker-sample:~/new-sail-application# php artisan sail:install

Czas na mały przegląd plików konfiguracyjnych

Zasadniczo przygotowaliśmy już nasze środowisko programistyczne. Każdy z kontenerów, jakie uruchomimy będzie zawierał tylko jedną usługę. W naszym przypadku będzie to kilka kontenerów, które widać w pliku konfiguracyjnym:

# 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'
            - '${HMR_PORT:-8080}:8080'
        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:
            - pgsql
            - redis
            - meilisearch
    pgsql:
        image: 'postgres:14'
        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:
            - 'sail-pgsql:/var/lib/postgresql/data'
            - './vendor/laravel/sail/database/pgsql/create-testing-database.sql:/docker-entrypoint-initdb.d/10-create-testing-database.sql'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "pg_isready", "-q", "-d", "${DB_DATABASE}", "-U", "${DB_USERNAME}"]
            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
    memcached:
        image: 'memcached:alpine'
        ports:
            - '11211:11211'
        networks:
            - sail
    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
networks:
    sail:
        driver: bridge
volumes:
    sail-pgsql:
        driver: local
    sail-redis:
        driver: local
    sail-meilisearch:
        driver: local

Przyjrzyjmy się niektórym elementom tego pliku. Element laravel.test obsługuje komponenty PHP:

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'
            - '${HMR_PORT:-8080}:8080'
        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:
            - pgsql
            - redis
            - meilisearch

A kontener pgsql obsługuje bazę danych postgresql:

pgsql:
        image: 'postgres:14'
        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:
            - 'sail-pgsql:/var/lib/postgresql/data'
            - './vendor/laravel/sail/database/pgsql/create-testing-database.sql:/docker-entrypoint-initdb.d/10-create-testing-database.sql'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "pg_isready", "-q", "-d", "${DB_DATABASE}", "-U", "${DB_USERNAME}"]
            retries: 3
            timeout: 5s

Wszystkie obrazy tutaj zawarte pochodzą z biblioteki Docker Hub, która jest największą biblioteką obrazów dockera w sieci. Każdy z nich jest dostarczany wraz z odpowiednią dokumentacją. W naszej konfiguracji wszystkie poświadczenia do wszystkich usług pochodzą z pliku .env, a wiec należy go odpowiednio uzupełnić.

Parę słów o dockerze, ok? Docker używa swoich woluminów do utrwalania lub zapisywania danych, które są używane przez kontener i są dostępne nawet po zniszczeniu kontenera. Jest to ważna informacja z kilku powodów. Należy pamiętać, że kontenery są tworzone tymczasowo i czasami ulegają awarii lub zostaną zatrzymane. Stąd tak ważne jest to, aby dane były zapisywane w wolumenie, ponieważ wtedy dane mogą zostać użyte w wielu kontenerach lub przez nowy kontener. W naszym przypadku wolumen dla bazy danych jest zdefiniowany poprzez sail-pgsql.

Dodatkowo, aby kontenery mogły rozmawiać ze sobą, to musza być umieszczone w jednej sieci. W naszym przypadku sieć nazywa się sail.

Kolejnym ważnym elementem jest health, który określa polecenia, jakie docker ma uruchamiać, aby sprawdzać aktualną kondycję kontenerów i upewniać się, że wszystko działa jak powinno.

Spójrzmy jeszcze raz na nasz kontener laravel.test. Parametr build określa plik Dockerfile, z którego zostanie zbudowany dany obraz. Ten plik został stworzony przez zespół Laravela i zawiera instrukcje tworzenia obrazu.

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'
            - '${HMR_PORT:-8080}:8080'
        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:
            - pgsql
            - redis
            - meilisearch

Parametr image wskazuje na obraz, jaki zostanie utworzony. W tym przypadku jest to obraz utworzony przez build. Porty natomiast mapują nasz kontener i porty lokalne razem, a zmienna environment określa, jakie dane uwierzytelniające maja zostać użyte podczas tworzenia kontenera. Parametr depends_on pokazuje, jakie usługi mają być uruchomione przed uruchomieniem tego kontenera. W tym przypadku jest to pgsql, redis i meilisearch.

Jak uruchamiać polecenia Sail

Jest to niezwykle proste. Sail domyślnie znajduje się w ścieżce ./vendor/bin/sail, ale nie ma problemu, aby skrócić obsługę wszystkich naszych poleceń. Wystarczy zrobić alias:

root@docker-sample:~# alias sail app_dir/vendor/bin/sail

Aby uruchomić wszystkie kontenery użyjemy polecenia:

root@docker-sample:~# sail up

A aby to zrobić w tle:

root@docker-sample:~# sail up -d

W normalnym przypadku Laravela używamy php artisan komenda, aby uruchomić polecenia linii komend laravela. W tym przypadku zastępujemy php artisan przez sail artisan:

root@docker-sample:~# sail artisan migrate

W przypadku composera używamy naszej aplikacji następująco:

root@docker-sample:~# sail composer require dostawca/paczka

Nie jest to skomplikowane, prawda?

Podsumowanie

Sail jest niezwykle przydatny podczas pracy zespołowej z frameworkiem Laravel. W tym artykule skonfigurowaliśmy Sail, dowiedzieliśmy się jak używać tego oprogramowania i jak konfigurowane są kontenery. Ale to dopiero początek.

Jak wiecie lub nie wiecie, posiadamy wspaniały kurs Dockera, napisany przez Krzysztofa Godzisza. Kontaktując się z nami, możecie go zamówić w trzech wersjach: sam dokument 12 rozdziałów czystej wiedzy z dockera od początkującego do eksperta za 99,99 złotych brutto, szkolenie online 16 godzin z prowadzącym w cenie 1230 złotych brutto od osoby i szkolenie stacjonarne u Was w firmie za 2460 brutto od osoby.

Zapraszamy do zakupienia naszego szkolenia z dockera: https://hardcorowy-docker.pl. Krzysztof Godzisz zajmuje się cyberbezpieczeństwem oraz serwerami od 2010 roku. Od 2021 jest badaczem, którego artykuły publikujemy na naszym blogu. Pomimo codziennej pracy w zupełnie innej dziedzinie i wykonywaniu obowiązków domowych co dzień w wieczór, od kilkunastu lat poszerza wiedzę w tym zakresie. W związku z ogromnym zamiłowaniem do hakingu stworzył stronę noishacking.pl na której dzieli się poznaną wiedzą. Na nasze zlecenie opracował niesamowity kurs dockera, który od podstaw pozwala przyjrzeć się jak działa to oprogramowanie oraz jak tworzyć środowiska przy pomocy Dockera i kontenerów.

Udostępnij

Porozmawiajmy o Twoich potrzebach

POROZMAWIAJMY O USŁUGACH, JAKICH POTRZEBUJESZ DLA SWOJEGO BIZNESU

Z chęcia pomożemy Ci wzrastać w wybranym przez Ciebie biznesie.