Portare Unmark dentro Docker

Alcuni giorni fa ho aggiornato il mio home server qubotto a Ubuntu 16.04. Inaspettatamente, dato che ho fatto l'aggiornamento un po' al buio, mi sono ritrovato con aggiornamenti importanti di PHP (da 5.6 a 7.0) e MySQL (da 5.6 a 5.7). Di colpo tutte le applicazioni LAMP (anche se nel mio caso uso Nginx) hanno smesso di funzionare insieme. All'inizio ho sudato freddo perché credevo
che le applicazioni non fossero compatibili con PHP 7. Per fortuna sono bastati alcuni ritocchi alla configurazione di Nginx e alcuni pacchetti PHP aggiuntivi per far ripartire tutto l'indispensabile.

L'unica cosa che non ne ha voluto sapere è stata l'applicazione di bookmarking Unmark. Dopo alcuni giorni di vani tentativi ho deciso di passare tutte le app self-hosted di qubotto in container Docker. Quale migliore candidato di Unmark per iniziare? Unmark infatti ha dei requisiti abbastanza tipici (è una normalissima applicazione LAMP) e ha un buon sistema di import/export che mi ha consentito di fare prove senza rischiare di perdere gli oltre 800 bookmark accumulati negli anni.

Una delle prime cose che ho infatti imparato usando Docker, è che la procedura di messa a punto dell'immagine, ovvero la definizione del Dockerfile non è propriamente banale. Il grande vantaggio di stabilire in modo chiaro le dipendenze in termini di librerie di sistema dell'applicazione, richiede l'investimento iniziale di messa a punto del Dockerfile che spesso è un lento processo di tentativi e fallimenti.

Per fortuna c'è un'immagine Docker già pronta per PHP, che contiene anche Apache, e una per MySQL. Basta linkarle insieme ed il gioco è fatto. Se ricordate l'approccio 12 factor, i database vanno isolati dall'applicazione in quanto backing service. Nel mio caso per comodità ho optato per Compose, strumento di Docker per gestire applicazioni con più container. Mettere insieme il tutto è stato abbastanza agevole e sono state utili le informazioni delle immagini docker per configurare correttamente il tutto.

Una nota particolare che mi ha lasciato perplesso sulle prime è stata l'occupazione di RAM, in particolar modo dovuta a MySQL. Nella configurazione base infatti il container occupava 450MB di RAM. Dato che su qubotto ho a disposizione 4GB, mi erano venuti dubbi che si potesse estendere questo approccio ad altre applicazioni. Ogni applicazione infatti dovrebbe avere il suo container MySQL, per non avere problemi di compatibilità (la causa del non funzionamento di Unmark dopo l'aggiornamento era proprio dovuto a un bug con MySQL 5.7).

Facendo un po' di ricerca sono riuscito a impostare le configurazioni minime dal punto di vista della memoria. Dal punto di vista delle performance in questo caso non ci sono particolari problemi dato che si tratta di un'applicazione usata solo da me. Dopo la cura, MySQL occupa solo 30MB!

Infine, ho racchiuso il tutto in una repo su GitHub: docker-unmark. Il tutto è stato abbastanza divertente, il che è positivo quando si ha a che fare con progetti personali. Il processo di messa a punto della soluzione infatti è stato una serie tentativi, con feedback abbastanza chiari quando incontravo errori, e soprattutto non ci sono stati dolori passi indietro, grazie al fatto che ad ogni tentativo le immagini vengono ricostruite completamente da zero, con un pieno controllo dei pacchetti installati in ogni momento.

Seguendo questo approccio, nei prossimi giorni porterò anche le altre applicazioni installate su qubotto dentro container, lasciando sull'host soltanto Nginx a fare da router.


Cover by Tyler Spaeth, some rights reserved