Docker e Laravel? Semplice, Laradock!

Hai sempre usato Vagrant ed Homestead per il tuo ambiente di lavoro ma Docker ti incuriosisce? Beh, è arrivata l'ora di conoscere Laradock!
francesco
Francesco Malatesta
20/07/2016 in Tutorial, Risorse

Quanti di voi, ad oggi, usano Homestead per lo sviluppo di un'applicazione Laravel? Credo tanti: in realtà anche io a volte, per questioni di velocità, ne faccio uso. A voler essere precisi, sono sempre stato affezionato ad Homestead Improved, una box migliorata rispetto all'originale "ufficiale".

Ultimamente, però, mi sto affezionando sempre di più a Docker. Più veloce, più flessibile, più potente rispetto a Vagrant. L'ho usato per la prima volta a lavoro, e da allora è stato amore a prima vista.

Qualche tempo fa mi sono dilettato con l'iniziare a creare un modo per tirare su un ambiente di lavoro decente, ma i risultati non sono stati eccezionali. Vuoi la mancanza di tempo, già diviso tra mille progetti, vuoi che all'epoca ne sapevo molto di meno su Docker rispetto ad ora... insomma, per i progetti veloci sono tornato ad usare Homestead.

Le cose sono cambiate, però, da quando ho conosciuto Laradock.

Cos'è Laradock?

Semplice: la pagina del progetto recita: "like Laravel Homestead but for Docker instead of Vagrant".

Più chiaro di così...

Ho, dunque, deciso di buttare giù due righe al volo su come far partire un progetto in pochi minuti usando proprio Laradock. Sperando di far avvicinare tante persone a Docker e al suo mondo.

"Beh, tutto bellissimo... ma cosa diamine è Docker?"

In realtà viene tutto spiegato benissimo sul sito ufficiale del progetto, ma direi che una piccola introduzione fa sempre bene.

Di base, un po' come già successo con Vagrant, Docker consente di astrarsi dal proprio sistema ed avere a disposizione un ambiente di lavoro ben definito e più vicino possibile a quello di produzione. A differenza di Vagrant, però, Docker ha un approccio orientato ai Container e non legato all'uso di una Virtual Machine.

Non avendo una semplice macchina virtuale, ogni componente software della nostra applicazione è un container separato. Ci sarà quindi un container per nginx, un altro per php, ed un altro ancora per mysql. E così via.

La condivisione del kernel tra i container, inoltre, consente una maggiore velocità e potenza, senza al tempo stesso rinunciare a tutti i benefici che si hanno già con Vagrant ed Homestead.

Direi, quindi, che vale la pena dare un'occhiata, no?

Prerequisiti

Per arrivare alla fine di questo articolo avremo bisogno di pochi software installati localmente. Tutto il resto, infatti, verrà astratto usando Docker. Precisamente, avremo bisogno di:

  • Git: è difficile che non sia già installato;
  • Docker: cliccando su questo link è possibile seguire la procedura d'installazione per qualsiasi sistema operativo. Lavorando con Mac o Windows potrebbe essere necessario installare alcuni software aggiuntivi;
  • Docker Compose: consente di organizzare facilmente applicazioni multi-container (si, la nostra lo è);

Creiamo il Progetto

Come già detto poco fa, useremo docker come "tramite" per i nostri software. Composer incluso! Useremo soltanto git e docker-compose.

Partiamo dal nostro progetto. Cloniamo il repository con cui si parte per creare un'applicazione Laravel.

$ git clone https://github.com/laravel/laravel laradock-test

Adesso, entriamo nella cartella con cd laradock-test ed eseguiamo

$ git clone https://github.com/LaraDock/laradock laradock

per installare Laradock nella sottocartella laradock. A questo punto, entriamo nella cartella con cd laradock ed avviamo Laradock con il seguente comando:

$ docker-compose up -d  nginx mysql

Nota: se dovessero verificarsi degli errori, proviamo ad eseguire il comando appena visto senza il flag -d.

Nota 2: non è obbligatorio installare Laradock come sottocartella del nostro progetto. Può essere scelta qualsiasi cartella, l'importante è assegnare il giusto valore al path presente nel file docker-compose.yml, in corrispondenza del container che indica il codice dell'applicazione.

Adesso useremo il container workspace per entrare in una shell in cui potremo usare composer ed altri tool, tutti quanti già pronti senza doverli installare.

$ docker exec -it laradock_workspace_1 bash

Dovremmo essere dentro: non rimane che avviare l'installazione del progetto tramite

$ composer install

Fatto? Bene. A questo punto l'applicazione dovrebbe essere già pronta.

Da un'altra shell, non quella che abbiamo appena usato, eseguiamo questo comando:

$ ifconfig docker0 | grep 'inet' | cut -d: -f2 | awk '{ print $1}' | head -n1

che ci consentirà di visualizzare l'indirizzo IP del container da usare. Copiamolo ed incolliamolo nel browser, e... magia!

Si, nulla di più: possiamo iniziare a lavorare.

Ah, nel caso in cui dovessimo lavorare anche con un database, non scordiamoci di specificare lo stesso indirizzo IP nel nostro file .env, in corrispondenza di DB_HOST. Usare il semplice localhost non funzionerà.

Et voilà! Da oggi possiamo sviluppare la nostra applicazione usando Laradock senza perdere troppo tempo per la configurazione dell'ambiente di lavoro. Niente male, vero?

Non Finisce Qui

Come degna conclusione conviene ricordare anche che non abbiamo a disposizione soltanto nginx e mysql. L'elenco presente sulla pagina del repository parla chiaro: PHP-FPM (7.0 - 5.6 - 5.5), NGINX, MySQL, PostgreSQL, MariaDB, Neo4j, MongoDB, Redis, Memcached, Beanstalkd, Beanstalkd Console, Workspace (che contiene: Composer, PHP7-CLI, Laravel Installer, Git, Node, Gulp, Bower, SQLite, Vim, Nano, cURL ed altri), Data (container per i dati del database), Application (container usato per il codice dell'applicazione).

Alcuni di questi container (precisamente workspace, data, php-fpm ed application) vengono sempre avviati.

Per quanto riguarda gli altri, invece, basta specificarne il nome come abbiamo fatto prima per nginx e mysql. Ad esempio, supponiamo di voler avviare anche un container per un'instanza Redis.

No problem:

$ docker-compose up -d nginx mysql redis

e via! I nomi da usare possono essere visti nel file docker-compose.yml. Chiaramente, nulla ci vieta di aggiungere altri container in base alle necessità.

Buon divertimento!