Docker: come ho dockerizzato il mio sito

Oggi vi parlerò di come Docker ha cambiato il mio modo di gestire i web server. Chi si trova spesso a configurare web server con Apache o Nginx, magari in una nuova macchina, sa bene quanto tempo sia necessario per preparare un ambiente LAMP (Linux Apache MySQL PHP). Di norma è sempre la stessa storia: installa la distribuzione Linux di turno, installa Apache, installa PHP, installa MySQL, configura il tutto (magari anche due orette) e si prepara a rendere disponibile il servizio che gli interessa… quando si accorgo che c’è qualcosa che non funziona e… ah, diamine, si è dimenticato che serviva la versione X di PHP e la versione Y di MySQL, ma nella versione Z della distribuzione che ha installato ovviamente non ci sono! Ed ecco ore di lavoro sprecato!
Siamo sinceri, a chi non è mai capitata una situazione del genere?

Ecco perché ho deciso di migrare tutto il mio sito in un ambiente con Docker,  dove ogni “servizio” gira in un proprio “container“. Praticamente, dopo aver fatto un backup di tutto quanto, ho reinstallato l’ultima distribuzione LTS di Ubuntu e ho installato Docker.
A questo punto, grazie a Docker Compose (un sistema per unire più container sotto un unico servizio), non ho fatto altro che scrivere il seguente file di configurazione (ovvero il servizio di tutto il mio sito) con tutti i container che mi interessavano:

E l’ho lanciato con un semplice:

Ed in circa due minuti Docker ha fatto tutto quello che avrei fatto io in circa 2 ore, comprese le configurazioni di database, nomi utente, password tra i vari container come WordPress, Mariadb (fork di MySQL), PhpMyAdmin e Jenkins. Infine ho ripristinato il backup precedentemente effettuato.
Ognuno di questi container, anziché girare sulla canonica porta 80, gira in ordine crescente dalla porta 8001 in su (scelta mia, poteva essere qualsiasi porta) in modo da poter aggiungere sempre nuovi container qualora mi servano.

Tutti i container girano dietro un proxy Nginx (con cui sono mappati tramite una variabile VIRTUAL_HOST) e l’intero ambiente viene controllato da un container chiamato WatchTower che si occupa di tenere aggiornate le immagini dei vari container con le ultime disponibili nel caso esca una nuova immagine.
Per intenderci: domani esce l’aggiornamento X di Mariadb? Ecco, non devo fare nulla, il container si aggiornerà da solo all’ultima release e si configurerà in automatico in tutti gli altri container ad esso collegati senza che abbia problemi di dipendenze o distribuzione.

Geniale, vero?