In questo Articolo parlo di come utilizzare “Docker Compose” per automatizzare il deployment di un server Web Apache che dia accesso (tramite proxy) ad applicativi Shiny e RStudio. Un unico comando prepara l’intero ambiente da zero: i server (Apache, Shiny e Rstudio) vengono scaricati, installati in modo isolato, e viene predisposta una rete privata per fare comunicare queste applicazioni. Unica dipendenza è avere Docker Compose installato sul computer.
Questo articolo è il seguito dell’articolo precedente dove ho spiegato le ragioni e i vantaggi di questa configurazione, come fare l’installazione e la configurazione manuale. In questo articolo spiego come ottenere un risultato simile con tecnologia Docker, in modo completamente automatizzato con “Docker Compose”.
Automazione
Questa operazione è quando basta. Credi di potercela fare? :-)
docker-compose up
Docker e Docker Compose
A cosa servono?
Partiamo dalle definizione:
Docker è un progetto open-source che automatizza il deployment (consegna o rilascio al cliente, con relativa installazione e messa in funzione o esercizio, di un’applicazione o di un sistema software tipicamente all’interno di un sistema informatico aziendale) di applicazioni all’interno di contenitori software, fornendo un’astrazione aggiuntiva grazie alla virtualizzazione a livello di sistema operativo di Linux. Wikipedia IT
Molto brevemente, diciamo che assomiglia ad una macchina virtuale dedicata ad una singola applicazione. Un container docker immaginatelo come composto da un eseguibile, una porzione di file system contenente l’ecosistema necessario all’applicazione, un’interfaccia di rete dedicata. Il container interagisce con l’ambiente tramite connessione di rete o regioni di file system condivise. Il vantaggio di questa configurazione è che gli applicativi nei container non dipendono dal software installato sul server, ma si portano dietro le dipendenze. Si evitano in così problemi di incompatibilità: se il container funziona su un computer funzionerà anche sugli altri. Questo consente di utilizzare software senza preoccuparsi di avere installato lo stesso identico environment, di fare degli aggiornamenti “per applicazione”, e di fare rollback con estrema facilità.
Compose è un’applicazione che permette di assemblare un numero di container Docker e utilizzarli come un unico servizio. Un unico file di configurazione descrive come configurarli, connetterli tra loro tramite una rete virtuale e dedicata.
Come si utilizzano?
Per comodità ho preparato un Repository Git con la configurazione: https://github.com/rinproduction/docker-rweb/
Il file YAML docker-compose.yml
contiene la configurazione della composizione:
|
|
Il file di configurazione contiene tre servizi (tre docker container) e una rete (sp-net
).
Apache è il server web utilizzato. L’immagine docker di apache
è indicata da bitnami/apache:latest
, che significa che si trova all’indirizzo https://hub.docker.com/r/bitnami/apache e se ne prende l’ultima versione. A questo indirizzo trovate la documentazione dell’immagine Docker. Il parametro ports
indica quali porte condividere con il mondo esterno al Compose: in questo caso le porte relative ai servizi HTTP e HTTPS. Gli indirizzi http://localhost e https://localhost funziona proprio perché le porte 80 e 443 sono condivise tra Docker e l’host (il computer). volumes
indica come condividere i file di configurazione tra l’host e uno dei container. environment
serve a configurare alcune variabili d’ambiente utilizzate nel container.
Le immagini che contengono gli applicativi Shiny ed RStudio sono prese da https://hub.docker.com/r/rocker/. Qui trovate un buon numero di immagini Docker aggiornate e pronte all’uso.
Nota che in docker-compose.yml
tutti i container sono collegati alla stessa sottorete: sp-net
. Questo permette ad Apache quando riceve una connessione di inoltrarla a Shiny o RStudio.
La prossima sezione contiente una piccola guida su come utilizzare questa configurazione nella pratica.
How-to
Requirements
Un computer con una distribuzione Linux su cui è installato o è possibile installare Docker e Docker Compose. Da notare che rispetto all’articolo con la procedura manuale, in cui si chiedeva che fossero presenti e installati RStudio e Shiny Server, qui non è richiesto perché la procedura installa anche questi software.
Installare Docker e Docker Compose
Per installare Docker utilizza le istruzioni specifiche per la distribuzione che stai utilizzando. Scrivo qui le istruzioni che ho testato su Ubuntu 20.04.
sudo apt install docker.io docker-compose
Scaricare la configurazione
Per scaricare la configurazione puoi utilizzare Git:
|
|
Nota: Ho creato una sotto-cartella rweb
perché Compose la utilizza per creare le etichette delle singoli istanze Docker: quindi rinominala con cautela se devi.
Se non hai git, scarica il repository da questo indirizzo: https://github.com/rinproduction/docker-rweb/archive/main.zip .
Attiva la configurazione
Premessa: devi avere i permessi per accedere al servizio docker per fare questo. Quindi o il tuo utente appartiene al gruppo docker
oppure devi utilizzare i privilegi amministativi (con su
o sudo
).
|
|
Se non hai ricevuto errori il servizio è attivo!
Vai sul tuo browser a
- https://localhost/ per avere la conferma del funzionamento
- https://localhost/shiny per accedere a Shiny Server
- https://localhost/rstudio per accedere a RStudio Server (user: rstudio, password: rinproduction)
Note sulla sicurezza
Il codice è stato scritto con il proposito di provare la possibilità e la facilità d’uso di Docker Compose applicato al nostro problema. In caso lo voglia utilizzare in produzione, in funzione della situazione, ci possono essere altre misure di sicurezza da prendere. Sicuramente è necessario rigenerare le chiavi SSL nella cartella config/ssl/
in quanto la la chiave segreta è condivisa su un repository pubblico (a beneficio della divulgazione). Trovi come rigenerare i certificati auto-firmati qui.
Conclusione
Con questa pratica si ottiene un sistema isolato dal server principale, le cui parti interne sono tra loro ben separate, possono essere aggiornate singolarmente e sono massimamente riproducibili: significa che, testate su un server, in linea di principio funzionano su tutti gli altri.
Commenti
Commenta su Linkedin
Commenta su Twitter