Laravel + Docker = Laradock cover image

Laravel + Docker = Laradock

alberto • February 24, 2021

devops

Ammettiamolo, 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:

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:

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:

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!