Creazione di un ambiente di sviluppo per Laravel con Docker


In questo post voglio descrivere la procedura per la creazione di un ambiente di sviluppo per applicazione web con Laravel utilizzando docker.

Docker?
Grazie a docker è possibile generare un ambiente per lo sviluppo di applicazioni PHP leggero e veloce e che soprattutto non dipende dalla configurazione del computer locale senza che sia necessario “sporcare” il proprio computer con l’installazione di PHP, Composer o altri tool. Per altre informazioni su docker puoi consultare la documentazione ufficiale.

Laravel?
Laravel è un framework per la creazione di applicazioni web in PHP basato sul pattern MVC.  Laravel promette di semplificare la vita allo sviluppatore fornendo fin da subito gli strumenti più utili per i problemi tipici delle applicazioni web come ad esempio un motore per il routing, un ORM per mappare il database e un sistema per gestire le migrazioni e un potente meccanismo per la dependency injection.
Anche in questo caso per approfondire laravel puoi consultare la documentazione ufficiale.

Per chi volesse avere fin da subito il codice sorgente del progetto può trovarlo su GitHub.

Setup Docker

Per sviluppare una web-app ho creato 3 diversi container:
  • web: in questo container ho installato il web-server nginx per gestire le richieste web;
  • app: questo è il container in cui è installato PHP e che conterrà il codice sorgente dell'applicazione Laravel;
  • postgres: questo container contiene il database postgres che verrà utilizzato dall’applicazione.
In questo modo, quando un utente vuole accedere ad una pagina dell’applicazione, viene inviata una richiesta HTTP al web-server nginx che si occuperà di comunicare con il container PHP e generare una risposta da rispedire all’utente.

Per gestire agevolmente i 3 diversi container ho utilizzato docker-compose (per utleriori informazioni vi rimando alla documentazione ufficiale). Quindi nella root del progetto ho creato il seguente file docker-compose.yml:

In particolare in questo file ho definito:
  • 3 servizi chiamati: web, app e pgsql
  • Ogni servizio viene creato a partire da un dockerfile che ho specificato all’interno della cartella .docker
  • il servizio web mappa la porta 8080 del computer locale con la porta 80 del container in modo da poter accedere al container attraverso l’url localhost:8080
  • il servizio web copia il file ./.docker/nginx/site.conf locale nella posizione /etc/nginx/conf.d/default.conf. Questo file serve per definire la configurazione di nginx (ci tornerò dopo)
  • il servizio app mappa l’intera root del progetto all’interno della cartella /var/www del container 
  • il servizio pgsql espone la porta 5432 in modo che sia possibile connettersi al database dal computer locale attraverso tool esterni come DBeaver o pgAdmin
A questo punto sono passato alla creazione dei dockerfile specifici per le singole applicazioni. Poichè la configurazione di questi servizi è molto semplice sarebbe stato possibile utilizzare solo il file docker-compose.yml per il setup ma per avere un ambiente di lavoro più ordinato e che possa essere esteso facilmente in un secondo momento ho preferito spezzare la configurazione in 3 dockerfile separati specifici per ogni servizio.

web.docker

Questo file è il più semplice in quanto prende semplicemente l’immagine di nginx e imposta la cartella di lavoro a /var/www

app.docker

Per questo servizio viene utilizzata l'immagine ufficiale di PHP 7.2 presente su docker-hub e vengono installate e configurate alcune dipendenze necessarie al corretto funzionamento di laravel. Da notare anche che in questo file viene installato composer.

database.docker

Per questo servizio viene utilizzata l’immagine ufficiale di postgres 10.2 e viene impostato il nome del database creato di default a laravel_app

Configurazione di nginx

Per poter utilizzare correttamente nginx come web-server è necessario definire il file di configurazione site.conf all’interno della cartella .docker/nginx

La configurazione di nginx utilizzata è molto semplice:
  • riga 2: metto il server in ascolto sulla porta 80
  • riga 4: imposto la root al path contenente i file PHP del progetto. In particolare per i progetti Laravel solo la cartella /public va esposta. Nel caso in questione verrà creata un applicazione Laravel chiamata blog per cui il percorso sarà /var/www/blog/public
  • righe 6-8: di default nginx cerca prima un file, poi una directory e se non riesce a trovarli tira un 404. Per poter utilizzare laravel tutte le richieste devono passare per laravel. Di conseguenza va rimosso il gestore dei 404 di nginx e vanno fatte passare tutte le richieste attraverso il file index.php in modo che laravel possa gestire e comportarsi di conseguenza
  • riga 12: da notare che le richieste vengono rigirate al container con PHP in maniera semplice utilizzando app:900. Questo è possibile in quanto docker permette di risolvere automaticamente gli hostname dei servizi creati.

A questo punto il setup dell’ambiente è completo ed è possibile avviarlo con il comando docker-compose up. (o docker-compose up -d se volete che l'esecuzione dei container avvenga in background)

Se tutto ha funzionato tramite il comando del terminale docker ps è possibile vedere i container in esecuzione.
Visualizzazione dei container in esecuzione

Installazione dell’applicazione laravel

Ora che l’ambiente di sviluppo è pronto è giunto il momento di creare l’applicazione laravel.
La prima cosa da fare è aprire una shell all’interno del container utilizzando il comando: docker exec -it app bash
Ora è possibile creare il progetto dell’applicazione laravel tramite composer con il comando
composer create-project --prefer-dist laravel/laravel blog
Creazione del progetto Laravel

Una volta che la procedura sarà terminata è necessario spostarsi all’interno della cartella del progetto e fare fornire i permessi di scrittura alla cartella /storage tramite il comando chmod -R o+w ./storage.
A questo punto aprendo con il browser http://localhost:8080 si aprirà la pagina di default di Laravel:
Pagina di default di Laravel


E questo è tutto, con pochissime istruzioni sarà possibile iniziare un nuovo progetto Laravel anche su un nuovo computer.
Spero di esserti stato utile e se hai qualche commento o suggerimento lasciami pure un commento! (:



Commenti