Docker dal localhost al cloud: Dockerizzazione di un progetto Laravel e suo deploy su Digital Ocean in pochi semplici passi!

Image for post
Image for post

Hai sempre sentito parlare di Docker ma non sai cos’è e soprattutto non sai come utilizzarlo? Bhè… questo articolo è per te! In pochi semplici passi potrai scoprire le potenzialità di Docker e potrai iniziare ad utilizzarlo sul tuo computer e perchè no? Anche sulla tua VPS in cloud! :)

Cos’è Docker?
Docker è una tecnologia che consente la creazione e l’utilizzo di container Linux indipendentemente da quale sia l’ambiente in cui essi vengono istanziati. Docker considera i container come macchine virtuali modulari estremamente leggere, offrendo la flessibilità di creare, distribuire, copiare, spostare o distruggere gli stessi container da un ambiente all’altro senza doversi occupare di configurazioni e dipendenze da essi richieste.
Questa caratteristica rende Docker l’approccio e la soluzione ideale per lo sviluppo di siti ed applicazioni web condiviso e il deploy in cloud.

Installazione
Per utilizzare Docker nel nostro computer dobbiamo scaricare ed installare Docker Desktop: https://www.docker.com/products/docker-desktop.
Il software è gratuito ed è disponibile sia per Windows che per Mac.
In questo articolo utilizzerò il mio Mac personale… un Macbook Air del 2019 i5 con 8Gb Ram e Catalina… insomma un buon Mac ma sicuramente non uno dei più “carrozzati”…. Docker non richiederà molte risorse al tuo computer!

Installazione & configurazione
Per la configurazione di Docker mi affiderò ad un mio progetto Open Source chiamato easydock: https://github.com/andreapollastri/easydock.
Questo repository non è altro che una mia “pre-configurazione” basata su Docker di un ambiente LEMP (Linux, nginx, MySql e PHP) corredato da un file di configurazione che permette, oltre alla scelta delle porte e di altre impostazioni base, di scegliere la versione PHP (attualmente le versioni disponibili sono 7.2, 7.3 e 7.4) e la versione di MySql (attualmente le versioni disponibili sono 5.7 e 8). Scarichiamo il progetto, tramite il comando:

git clone https://github.com/andreapollastri/easydock

Dopo aver clonato il progetto in locale (o scaricato manualmente se non avete Git), entrate nella cartella creata:

cd easydock-master

Successivamente eseguite l’init dell’ambiente Docker con:

sh ed-init

Questa operazione richiederà qualche minuto e a termine dell’operazione troverete nella vostra directory un file .env che potete personalizzare a seconda delle vostre esigenze, successivamente avviate Docker:

sh ed-start

Anche questa operazione potrebbe richiedere del tempo ma a fine operazione il nostro ambiente è pronto e possiamo trovare una welcome page del progetto se digitiamo http://localhost (con eventuale porta impostata) all’interno del nostro browser.

Utilizzo
Bene! Docker è stato installato, configurato ed avviato e sono stati avviati grazie a lui:
- una macchina Linux
- diversi servizi e software terze parti all’interno del container
- un webserver nginx
- un pool php-fpm
- diverse estensioni PHP
- un engine MySql
- phpmyadmin
- Mail Hog

Ora che nel vostro computer sono memorizzate le immagini di questi servizi, i futuri riavii Docker di questo progetto saranno molto veloci!

Non ci resta quindi che “loggarci in SSH” all’interno del nostro container!

sh ed-conn

E per questo esempio andremo a installare Laravel tramite Composer:

rm -rf public && composer create-project laravel/laravel .

Ricordiamoci di non scordarci del punto (.) finale nel comando di prima ed attendiamo che Composer faccia il suo lavoro.
Quando avrà terminato Laravel sarà installato nel nostro container Docker e ricaricando il localhost nel nostro browser dovremmo vedere la welcome page del celebre framework PHP:

Image for post
Image for post

A questo punto possiamo sviluppare comodamente in locale il nostro sito / applicativo Laravel utilizzando anche MySql (se vi è l’esigenza).
Per farlo dovremo compilare il file .env di Laravel indicando le configurazioni del nostro Docker… alcuni di questi parametri possono essere personalizzati nel file di ambiente di easydock, questi sono quelli di default, importante però è impostare correttamente l’hostname di connessione db a “mysql”.

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=dockerdb
DB_USERNAME=root
DB_PASSWORD=secret

Possiamo anche configurare l’SMTP di invio posta a convergere nel nostro Mail Hog utile a fare tutti i test del caso senza “intasare” / utilizzare mail reali.

MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=test@test.dev
MAIL_FROM_NAME="${APP_NAME}"

Se volessimo collaborare a questo progetto con altri colleghi e/o deployare il tutto su una VPS in cloud è consigliabile creare un repository Git di tutta la cartella orginale easydock-master scaricata a inizio articolo.
In questo modo ogni collaboratore del progetto avrà il proprio ambiente Docker e potrà lavorare comodamente lavorare sul progetto!

Gestione di Docker (tramite easydock)

Per avviare il container:

sh ed-start

Per stoppare il container:

sh ed-stop

Per entrare nella sessione SSH del container:

sh ed-conn

Per uscire dalla sessione SSH del container:

exit

Deploy in cloud
Per deployare il progetto in questo esempio ho scelto di utilizzare un droplet di Digital Ocean con la pre-installazione di Docker fornita dal suo Marketplace ufficiale:

Image for post
Image for post

Una volta creata la macchina, ci logghiamo in SSH e cloniamo il nostro progetto GIT su di essa:

git clone https://github.com/andreapollastri/eg-easydock-medium-article

Per comodità io sto usando un semplice Git Clone ma è chiaro che possiamo fare degli script di deploy più complessi ed associare chiavi di deploy per gestire repo privati (ma non è lo scopo di questo articolo, forse più avanti ne scriverò uno dedicato a tale materia).

Una volta che abbiamo il progetto all’interno della nostra macchina in cloud ripeteremo le operazioni preliminari eseguite a inizio articolo, aggiungendone alcune, quindi ecco la lista:

sh ed-init
sh ed-owner
sh ed-start
sh ed-conn
nano .env
composer update
php artisan config:cache
php artisan view:cache
php artisan route:cache
php artisan migrate --seed
exit

Ricordiamoci il “nuovo” comando sh ed-owner che fixa eventuali problemi di permessi in un ambiente cloud e ricordiamoci di configurare i file .env di Docker e di Laravel a seconda delle nostre esigenze (per esempio è consigliato utilizzare una password complessa per l’utenza del database in produzione).

Inoltre possiamo occuparci di alcune operazioni che migliorano la sicurezza della nostra VPS e quindi impostare il firewall di Digital Ocean relativo a questa macchina ad impedire accessi sulle porte del db, di phpmyadmin e di mailhog. Lasceremo attive solo la 80 e la 22.

Image for post
Image for post

Consiglio inoltre di utilizzare un servizio come Cloudflare (magari abbinato a un balancer nginx) per la gestione dei certificati SSL, protezione DDoS, CDN, ecc..

Il codice prodotto per questo articolo è disponibile su Github: https://github.com/andreapollastri/eg-easydock-medium-article,
Spero che questo articolo ti sia piaciuto e che possa esserti utile o quanto meno di “ispirazione” per la gestione dei tuoi progetti. Per qualsiasi informazione, suggerimento e/o critica costruttiva: andrea@pollastri.dev.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store