
Laravel + Docker = Laradock
alberto • February 24, 2021
devopsAmmettiamolo, abbiamo tutti utilizzato php artisan serve
per eseguire applicazioni Laravel per non perder tempo a setuppare un "vero" ambiente.
E, ammettiamolo, siamo tutti diventati matti perchè abbiamo dovuto aggiornare PHP e NodeJS perchè la versione che girava sul nostro sistema operativo non quella che volevamo utilizzare per la nostra applicazione.
Per un attimo Homestead ha potuto essere la soluzione, ma anche in questo caso ci siamo scontrati con la necessità di avere diverse versioni del software e con il limite di non poter avere ram infinita sulle nostre macchine.
Abbiamo quasi avuto un collasso quando Otwell ha presentato Sail ma forse è un po' troppo light come strumento.
Se siete arrivati a questo punto e siete d'accordo con me, ho una buona notizia per voi: la soluzione a tutti i nostri mali si chiama Laradock.
Laradock
Secondo gli sviluppatori del prodotto, Laradock,
is a full PHP development environment for Docker.
Seppur la definizione è un po' pomposa grazie a quel full devo ammettere che hanno mantenuto, almeno per quanto mi riguarda, quello che hanno promesso.
Laradock è un insieme di container Docker, ben correlati tra di loro, che permette di eseguire praticamente qualsiasi tipo di applicazione Laravel appoggiandosi completamente a Docker, senza particolari vincoli rispetto alla macchina host.
Possiamo avere a disposizione parecchi software pre-pacchettizzati e in qualsiasi versione esistente.
Prima di approfondire il discorso, devo fare però una ammissione: non sono esperto di Docker (qualcuno puó davvero dichiararsi tale?). Ma grazie a Laradock anche i meno esperti possono usarlo in modo molto produttivo.
Installazione
Laradock necessita che sulla macchina host ci siano installato esclusivamente due strumenti:
- Docker (>= 17.12)
- Git
Tutto il resto è superfluo.
Laradock può essere installato in due modalità: - per progetto - globalmente
Personalmente ho da sempre preferito la prima opzione che, seppur un pelo più onerosa in termini di setup, permette di configurare diversamente l'ambiente dove eseguire le nostre applicazioni. Credo comunque che al netto di questo vantaggio, non ci siano particolari differenze.
In questo articolo analizzeremo il caso in cui si voglia installare Laradock all'interno di un progetto già esistente. Sulla guida ufficiale ci sono altri casi d'uso per chi volesse approfondire.
cd my-project
git submodule add https://github.com/Laradock/laradock.git laradock-my-project
cd laradock-my-project
cp env-example .env
docker-compose up -d nginx mysql
Praticamente creiamo un sotto-modulo git all'interno della cartella del nostro progetto all'interno della cartella laradock-my-project
. Una volta fatto creiamo un file .env
partendo dal file di esempio e avviamo i container nginx
e mysql
in modalita demone (personalmente preferisco evitare questa ultima opzione rimuovendo -d
ma è una scelta personale).
Se tutto ha funzionato regolarmente, Laradock dovrebbe essere avviato.
Ultima cosa da fare per questo setup veloce è quella di modificare il file .env
dell'applicazione inserendo:
DB_HOST=mysql
MYSQL_USER=default
MYSQL_PASSWORD=secret
Questo perchè Laradock crea un hostname mysql
che punta al container appena avviato.
Il file .env
Una delle operazioni necessarie prima di avviare i container è quella di creare un file .env, per praticità partendo dal file di esempio scaricato da git. In questo file sono presenti tante configurazioni, la maggior parte delle quali probabilmente non servirà.
Nel file sono infatti presenti le configurazioni di tutti i container disponibili. Solitamente i nomi sono abbastanza chiari ed è facile trovare quello che ci interessa.
Eseguire comandi artisan
Come anticipato prima, Laradock è un set di container pronti all'uso per gestire applicativi Laravel. Nell'esempio di prima, tramite il comando docker-compose up -d nginx mysql
abbiamo avviato i container nginx
e mysql
il cui scopo mi sembra abbastanza chiaro.
Oltre ai container avviati esplicitamente, Laradock si occupa di avviare altri container utili alla causa, in particolare:
php-fpm
all'interno del quale girerà il modulo fpm per eseguire PHPworkspace
nel quale andremo a lanciare i nostri comandi artisandocker-in-docker
che rappresenta un container strutturale per far girare il resto
Quello che in realtà serve sapere è che per eseguire eventuali comandi artisan
sarà necessario accedere alla shell del container workspace e, da lí, eseguire i comandi. Grazie a docker-compose exec workspace bash
possiamo aprire una shell interna al container.
Lo stesso container può essere utilizzato per lanciare phpunit
per i nostri test, composer
per scaricare dipendenze o npm
.
Accedere a MySQL
Una delle necessità che mi sono trovato a dover configurare è quella della possibilità di accedere al database anche al di fuori del container Docker, tramite strumenti come MySQL Workbench. Accedervi è facilissimo, considerando che Docker espone i servizi su porte dedicate.
È esclusivamente necessario modificare il contenuto della configurazione MYSQL_PORT
(io di solito metto 13306) per comunicare a Docker su quale porta della macchina host esporre il servizio. Una volta fatto basterà configurare il client per accedere su localhost alla porta specificata. L'utente con il quale accedere è root
e la password è quella che specificherete nella chiave MYSQL_ROOT_PASSWORD
.
Qualora fosse necessario creare uno o più database in automatico, nella cartella mysql/docker-entrypoint-initdb.d
sono presenti alcuni comodi script che verranno avviati automaticamente da Laradock.
Altri container utili
Durante il mio utilizzo di Laradock mi sono trovato a dover avviare ulteriori container oltre a quelli "stardard" specificati prima. In particolare:
- redis utilizzando
REDIS_HOST=redis
all'interno del file .env applicativo - php-worker per avviare worker per avviare code asincrone
- selenium per lanciare test tramite Laravel Dusk
Questi sono comunque solamente un piccolo estratto di tutti i servizi presenti in Laradock.
Conclusioni
Personalmente è stato amore a prima vista. Dopo un po' di rodaggio, principalmente derivante dalla conoscenza scarsa di Docker, devo ammettere che Laradock ha mantenuto tutte le promesse. In pochi secondi si riescono ad avviare applicazioni standard senza toccare nulla del sistema host e potendo personalizzare praticamente tutto.
Con estrema facilità sono anche riuscito a configurare anche ambienti particolari, multitenancy basati su host differenti, sfruttando il file .env e la documentazione di Laradock.
Il mio consiglio è quello di dargli una possibilità se non l'avete mai utilizzato. Ne rimarrete impressionati!