Introduzione
Docker è uno strumento scelto da molti programmatori per via del supporto che offre nello sviluppo di applicazioni. Il tool permette, infatti, di creare dei containers che rendono le applicazioni indipendenti dall'ambiente di sviluppo o dal sistema operativo con cui vengono eseguite.
Docker ci viene in aiuto in combinazione con il framework Laravel. Nella guida potrai scoprire l'utilizzo di Sail, un pacchetto che ti permetterà di usare Laravel in versione dockerizzata, lasciando a lui il compito di creare un ambiente di sviluppo con Docker, senza dover creare manualmente i container.
L'ambiente creato fornirà in automatico una installazione di PHP, MySQL e Redis. Questo è un grande vantaggio se sei uno sviluppatore Laravel, perchè non dovrai preoccuparti di installare questi pacchetti sul tuo OS o controllare che essi siano correttamente aggiornati. Avrai infatti la possibilità di creare ed eliminare container compatibili con diverse versioni, per poterli adattare allo sviluppo che desideri per la tua applicazione.
Un altro vantaggio è la possibilità di condividere l'ambiente di sviluppo del progetto con i tuoi collaboratori, senza rendere necessaria l'installazione di altri software sul loro sistema operativo.
Con il pacchetto di Sail, avrai solo due file:
- docker-compose.yml , che gestirà i containers per la tua applicazione;
- Un file che servirà a definire le interazioni con i containers.
Pre-requisiti
L'unico requisito necessario per utilizzare Sail è avere installato Docker sul proprio sistema operativo. Se non hai già installato Docker e utilizzi Ubuntu, puoi seguire la nostra guida su Come installare Docker su Ubuntu 18.04.
Installazione e Configurazione di Sail
Comincia creando una nuova applicazione Laravel tramite il comando:
$ curl -s https://laravel.build/my_sailapplication | bash
Con questo codice, avrai creato un nuovo progetto Laravel in una directory chiamata, come nell'esempio, "my_sailapplication".
Ora, spostati nella directory del progetto:
$ cd new-sail-application
Ora, occorre lanciare Sail:
$ ./vendor/bin/sail up
Aggiungere Sail a una applicazione già esistente
Tramite il comando composer, ti sarà possibile aggiungere Sail a una applicazione già esistente. Per farlo, usa il comando:
$ composer require laravel/sail --dev
A installazione completata, puoi inserire il file docker-compose.yml di Sail nella tua directory di progetto, tramite il comando:
$ php artisan sail:install
Infine, come prima, lancia Sail:
$ ./vendor/bin/sail up
Analisi del tuo ambiente di sviluppo
I tre container principali che troverai nel tuo ambiente di sviluppo, riguarderanno i tre servizi installati di default con Sail: PHP, MySQL e Redis.
All'interno della directory di progetto, potrai trovare il file docker-compose.yml, già citato precedentemente. Questo file conterrà una sezione dedicata ai 3 servizi sopracitati: laravel.test (per il PHP), mysql e redis.
Iniziamo col vedere, passo passo, le configurazioni dei vari servizi.
MySQL
Nella configurazione del database, la prima voce in cui ti imbatterai è image, la quale indica l'immagine e la versione di MySQL che verrà istanziata nel tuo container.
Le immagini sono fornite da Docker Hub, una enorme libreria di immagini sul web che, qualora non conoscessi, ti consigliamo di visitare per esplorarne le possibilità e i dettagli.
Un'altra voce importante è ports, che serve a sincronizzare la porta del container con quella locale. Infatti, l'istruzione ${FORWARD_DB_PORT:-3306}:3306 servirà proprio a svolgere questa funzione.
Alla voce environment, troverai invece il database selezionato e le sue credenziali.
Ma la distruzione di un container e del suo ambiente, porterà alla distruzione dei dati persistenti come il database? La risposta, per fortuna, è no. Il docker salva i dati persistenti in un percorso esterno a cui poi i containers possono fare riferimento. Il vantaggio, quindi, è anche la possibilità di far riferire più containers alla stessa "banca dati".
I dati sono di solito salvati nei volumi. Nella istruzione volumes: - 'sailmysql:/var/lib/mysql' , sarà specificato l'uso di un volume di nome sailmysql per salvare i dati nella directory var/lib/mysql.
I servizi del tuo container dovranno, ovviamente, cooperare sulla stessa rete (in tal caso, quella di Sail.). il parametro network con la voce sail, indica proprio questo.
Infine, la voce healthcare specifica i comandi da lanciare per permettere al Docker di eseguire un controllo sul corretto funzionamento dei tuoi containers.
PHP
La sezione laravel.test è dedicata ai servizi collegati al linguaggio PHP.
Il primo parametro che incontri è build. Il parametro contiene il percorso a un file Docker, contenente le istruzioni per creare l'immagine che verrà istanziata.
Il parametro image punta all'immagine che verrà istanziata, creata dal parametro build. ports svolge la funzione di collegare il container e la porta locale.
In environments sono descritte le credenziali da usare nel codice PHP, volumes è usato per salvare nei volumi delle informazioni che debbano essere permanenti, come spiegato prima. Mentre networks specifica la rete a cui il servizio dovrebbe esser connesso.
Il parametro depends_on specifica infine quali servizi dovrebbero essere in esecuzione prima che la tua applicazione inizi.
Redis
Redis ha dei parametri simili a quelli di MySQL.
Sostanzialmente, viene istanziata una immagine, dopodichè le porte tra il localhost e il container vengono sincronizzate. Tramite il volume, invece, si salvano i dati che devono essere persistenti.
Ritroverai, infine, il parametro networks e healthcheck per stabilire su quale rete operare e per controllare il funzionamento corretto di Redis.
Primi comandi di Sail
Dovendo usare spesso vendor/bin/sail, è opportuno assegnare questa stringa a un alias più breve.
$ alias sail='bash vendor/bin/sail'
Per mandare in esecuzione i containers dal docker-compose.yml :
$ sail up
Per eseguire un container in background, usa allora il comando:
$ sail up -d
Per interrompere l'esecuzione, invece, premi CTRL+C e, per terminare i processi in background, esegui il comando:
$ sail down
Per altri comandi come quelli di artisan, composer o npm, è opportuno aggiungere l'alias sail come prefisso di questi comandi.
Per esempio:
$ sail composer require laravel/sanctum
Conclusioni
A questo punto, sarai stato in grado di creare e configurare la tua prima applicazione con Sail, e di comprenderne il funzionamento e il significato delle diverse voci nel file docker-compose.yml e nei servizi offerti.