This page looks best with JavaScript enabled

#4 Installazione automatizzata di un server web R per Shiny e RStudio con Docker Compose

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
version: '3.5'

services:
  apache:
    image: 'bitnami/apache:latest'
    user: "0:0"
    ports:
      - '80:80'
      - '443:443'
    networks:
      - sp-net
    volumes:
      - ./config/apache/httpd.conf:/opt/bitnami/apache/conf/httpd.conf:ro
      - ./config/apache/r-ssl.conf:/vhosts/my_vhost.conf:ro
      - ./config/ssl:/etc/ssl:ro
    environment:
      - APACHE_HTTP_PORT_NUMBER=80
      - APACHE_HTTPS_PORT_NUMBER=443

  shiny:
    image: 'rocker/shiny'
    networks:
      - sp-net

  rstudio:
    image: 'rocker/rstudio'
    networks:
      - sp-net
    environment:
      - PASSWORD=rinproduction
      - DISABLE_AUTH=false
      # - ADD=shiny

  
networks:
  sp-net:
    name: rweb_sp-net    

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:

1
2
git clone https://github.com/rinproduction/docker-rweb
cd docker-rweb/rweb

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).

1
docker-compose up

Se non hai ricevuto errori il servizio è attivo!

Vai sul tuo browser a

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

Share on