Ho sempre usato Vagrant (con l’epica Homestead Improved) di Swader per gestire le mie macchine virtuali.
Per fortuna ho abbandonato già da tempo lo sviluppo totalmente “in locale” e devo dire che è una delle cose migliori che io abbia mai fatto. Ad ogni modo, mi sono sempre interessato alle “novità” e recentemente ho iniziato ad avvicinarmi a Docker.
L’impatto, in tutta onestà, non è stato dei migliori. Anche perché è difficile, alle volte, capire al volo una serie di nuove nozioni che devono andare a “sostituire” qualcosa che già conosciamo. Una parte di noi tenta di rimanere nel “comodo” senza preoccuparsi di uscire dalla gabbia dorata di quello che già conosciamo.
Alla fine, però, ne ho cavato qualcosa ed ho deciso di preparare un ambiente di lavoro pronto all’uso che unisca la versatilità di Docker al nostro framework preferito.
Laravel Dockerized, che ho realizzato partendo da un fork di PHP Dockerized, presenta tutto l’occorrente per scrivere il proprio primo progetto Laravel usando Docker.
Software Inclusi
Al momento in cui scrivo questo articolo, in Laravel Dockerized è possibile trovare delle configurazioni già pronte per includere:
Requisiti
Laravel Dockerized presenta alcuni prerequisiti.
Precisamente:
- Docker Engine;
- Docker Compose;
- Docker Machine (solo nel caso in cui si stia usando Mac o Windows);
Installazione ed Avvio
La prima cosa da fare è scegliere quali servizi includere e quali no. Dopo aver clonato il repository tramite un semplice
git clone https://github.com/francescomalatesta/laravel-dockerized dockerizedLaravelApp
tutto quello che si dovrà fare sarà accedere al file docker-compose.yml
e rimuovere i servizi che non necessari.
Come? Facciamo subito un esempio. Questo è il file “standard” già incluso nel repository:
front:
build: .
ports:
– “80:80”
– “443:443”
– “9000:9000”
links:
– mysql:mysql
– mariadb:mariadb
– mongo:mongo
– memcached:memcached
– redis:redis
– elasticsearch:elasticsearch
volumes:
– ./www:/var/www
– ./sites:/etc/nginx/conf.d
mysql:
image: mysql
ports:
– “3306:3306”
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
mariadb:
image: mariadb
ports:
– “3306:3306”
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
TERM: dumb
mongo:
image: mongo
ports:
– “27017:27017”
memcached:
image: memcached
ports:
– “11211:11211”
redis:
image: redis
ports:
– “6379:6379”
elasticsearch:
image: elasticsearch
ports:
– “9200:9200”
– “9300:9300”
Non è molto difficile da capire, anche nel caso in cui non si sia pratici di file .yml
. Basta immaginare, infatti, che ogni elemento presente in questo file come un servizio che il nostro software userà. Il database mysql, redis per la cache, elasticsearch, o magari MongoDB se non si vuole lavorare con il relazionale.
Ora, supponiamo che per la nostra applicazione avremo bisogno di tre semplici componenti:
- il server, per servire le pagine con cui lavoreremo;
- un database mysql;
- redis per gestire la cache;
Sappiamo cosa vogliamo: ora provvediamo a “snellire” il nostro file. Che diventerà così:
front:
build: .
ports:
– “80:80”
– “443:443”
– “9000:9000”
links:
– mysql:mysql
– redis:redis
volumes:
– ./www:/var/www
– ./sites:/etc/nginx/conf.d
mysql:
image: mysql
ports:
– “3306:3306”
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
redis:
image: redis
ports:
– “6379:6379”
Et voilà! Nulla di più.
A questo punto, il grosso è fatto. Non scordiamoci di creare il progetto Laravel: entriamo nella cartella www
ed eseguiamo
composer create-project laravel/laravel default
Una volta finita la procedura non rimane che avviare il tutto, con il comando
docker-compose up
Ed Ora?
Le cose sono due: se è la prima volta che usiamo Docker e questi container, allora ci sarà bisogno di un po’ di tempo per scaricarli ed installarli. Farà tutto Docker in automatico, non c’è da preoccuparsi.
Altrimenti, in pochi secondi dovremmo avere il nostro ambiente pronto all’uso.
Stando alle impostazioni specificate nel file .yml
, la porta 80 è stata scelta per il “dirottamento” del traffico.
In poche parole, la nostra applicazione dovrebbe essere ora disponibile all’indirizzo `http://localhost`!
Comodo, eh?