Installare un server LAMP con Docker su Raspberry Pi

di | 1 Febbraio 2021

Sul web ci sono a disposizione numerose guide su come installare un ambiente LAMP su Docker. Eppure serve questa guida, dato che le altre non funzionano su Raspberry Pi OS. Perché?

Perché su Docker per Raspberry manca la M. Infatti non esistono pacchetti ufficiali per MySQL o per MariaDB per l’architettura ARM a 32 bit. Per fortuna, però, alcuni utenti hanno sviluppato delle versioni non ufficiali direttamente ricompilate dall’originale che possono essere usate.

Ma perché dovrei usare Docker quand’è così semplice installare normalmente?!

Perché le cose si introiano molto più velocemente di quanto si pensi. Basta magari un’installazione sbagliata per mandare a miglior vita la vostra installazione LAMP. E se c’è qualcosa di più tedioso di imparare un nuovo meccanismo è ripristinare i pacchetti su Debian. Sì, ok, è un sistema più stabile di Windows, ma su diecimila operazioni una avrà anche il diritto di impallarsi e se riguarda anche solo minimamente MariaDB siete fregati e fate prima a reinstallare.

Altro elemento utile è la possibilità di esportare molto più velocemente il vostro progetto: se lo volete distribuire non avrete bisogno di far configurare un ambiente LAMP, ad esempio e se state magari creando un software per un’azienda state creando un ambiente standard che può funzionare ovunque, senza cadere nella trappola del “ma funzionava sulla mia macchina, perché non funziona su questo Raspberry configurato in modo completamente diverso?”.

Parte 1: installare Docker (se non lo avete)

Nella mia installazione uso Docker com’è nei repository di Raspberry Pi OS Buster, che è una versione un po’ vecchiotta ma funziona bene. Per installarla, è sufficiente digitare a terminale:

sudo apt install docker

Se avete una versione più recente pace amen: al 90% funzionerà, al 10% saranno i messaggi d’errore a guidarvi. Sono davvero chiari e semplici.

Potete, se preferite una versione più aggiornata, seguire la documentazione di docker e installarlo manualmente.

Parte 2: pre-configurazione

Per il progetto c’è bisogno di una directory apposita per i dati di progetto e una per l’HTML, che potete creare alla svelta così:

mkdir -p ~/docker/lamp/html

dovete poi recarvi nella directory ~/docker/lamp dove creerete un file denominato php.Dockerfile che deve avere come contenuto:

FROM php:7.4.3-apache
RUN docker-php-ext-install mysqli pdo pdo_mysql
Create poi un file denominato docker-compose.yaml che avrà come contenuto:
version: "3.3"
services:
web-server:
build:
dockerfile: php.Dockerfile
context: .
restart: always
volumes:
- "./html/:/var/www/html/"
ports:
- "80:80"

db:
image: jsurf/rpi-mariadb
restart: always
environment:
MYSQL_ROOT_PASSWORD: [PASSWORD DI ROOT]
MYSQL_DATABASE: [NOME DATABASE]
MYSQL_USER: [NOME UTENTE]
MYSQL_PASSWORD: [PASSWORD DATABASE]
ports: #togliere se non si vuole esposizione, vedere sotto
- 3306:3306 #idem come sopra

Parte 3B: installare un gestore grafico di database

Spesso fa comodo avere bisogno di un’interfaccia grafica per la gestione web del database. Non è una parte essenziale del LAMP, si dimostra però un tool davvero utile in molti casi, permettendo anche di ridurre le interazioni via linea di comando per operazioni come i dump.
Come gestore ho scelto adminer, noto per la sua leggerezza, ma è possibile anche usare il più noto phpmyadmin.
Onestamente, poco cambia, almeno se il vostro Raspberry è un modello avanzato come un 3B+ o un 4. Se poi siete maghi del SQL potete anche rinunciare in toto ad una interfaccia grafica per gestire il database o usare un client desktop.
Attenzione! Una cosa da notare è che Adminer non viene configurato in automatico, sia dockerizzate che no, ma va configurato. Come host, nel caso, non dovrete mettere “localhost” ma il nome del servizio (nel nostro caso, “db”). I container Docker ragionano come se fossero computer autonomi, ergo sul localhost di adminer/del server non ci sarà

Dockerizzare o non dockerizzare?

Sul tema, però, posso spezzare una lancia a favore di non dockerizzare. Infatti, i vari gestori sono delle semplici applicazioni PHP.

Se il vostro obiettivo è di avere un sistema standard che includa uno di questi gestori, ovviamente, sarà utile dockerizzarlo. Ciò permetterà anche, come professionalità comanda, l’uso di una porta separata da quella del web server.

Se si tratta invece di un vostro ambiente di sviluppo oppure di un’immagine multiuso che potrebbe non richiedere tale software o richiederlo solo in alcuni casi non lo includerei, lasciando l’installazione ad un secondo momento, scegliendo se dockerizzarla o meno.

In ogni caso, se il vostro Raspberry non è potente, la dockerizzazione potrebbe aggiungere del peso inutile, sia in termini di RAM che di CPU.

Giusto per capirci adminer, un file di circa 500 KB, con Docker pesa più di 60 MB, poiché deve integrare tutto quello che serve a farlo girare autonomamente.

Insomma, non c’è una risposta giusta: dipende sempre da potenza e standardizzazione richieste.

Stringhe di installazione

Per aggiungere adminer con Docker sarà sufficiente aggiungere nel file docker-compose.yaml la seguente stringa:

adminer:
  image: adminer
  restart: always
  ports:
    - 8080:8080

Qualora preferiste, invece, phpmyadmin la stringa sarà questa:

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:5.0.1
    restart: always
    environment:
      PMA_HOST: [NOME DATABASE]
      PMA_USER: [NOME UTENTE]
      PMA_PASSWORD: [PASSWORD DATABASE]
    ports:
      - 5000:80

Parte 3: finalmente il server!

Per avviare il server è sufficiente digitare a terminale:

docker-compose up -d

I servizi, quindi, si avvieranno demonizzati, ossia in background. Da questo momento potrete accedere dall’IP del vostro dispositivo e visualizzare il server. Ovviamente dovrete mettere almeno una index nella directory dedicata all’HTML, sennò riceverete un errore.

Potrete anche usare uno script di connessione PDO per provare la connettività al database, che dovrebbe funzionare senza problemi. E se dovete fermare il server? Basta tornare nella directory e digitare:

docker-compose down

Sarà sempre possibile riavviarlo con il comando esposto all’inizio di questo paragrafo.

Parte 4: possibili cose da tenere a mente

#1: Sicurezza

In questa installazione, è bene farlo notare, il database è accessibile fuori da localhost. Ciò consente di usare tool di gestione remota, ad esempio, ma è sconsigliabile qualora il sistema debba essere messo su Internet o anche in una LAN non molto sicura.

In tal caso è ovviamente possibile agire in più modi: il primo, utile qualora sia necessario mantenere un minimo di uso tramite tool remoti, è agire a livello di firewall in modo da limitare gli indirizzi da cui è possibile connettersi.

Oppure è anche possibile eliminare completamente l’esposizione delle porte, eliminando le stringhe relative alle porte che sono marcate nel file di configurazione.

In tal modo sarà possibile accedere solamente dalla macchina locale e da altre applicazioni dockerizzate, come spiegato precedentemente.

#2: Altri database

Se l’idea di usare un database non ufficiale, magari in produzione, non vi coinvolge particolarmente potete usare l’unico database che è presente ufficialmente su Raspberry Pi: PostgreSQL.

È un database SQL abbastanza simile a MariaDB e se non conoscete già le differenze in prestazioni, probabilmente, poco vi importerà.

Se sapete il significato di “mettere in produzione” probabilmente non vi servirà un tutorial dettagliato, ne trovate qui uno in caso di necessità: basta cercare sul Docker Hub PostgreSQL e seguire le indicazioni.

Per la gestione grafica potete usare sia adminer che un prodotto apposito che si chiama pgadmin4. La versione ufficiale non è disponibile per ARM a 32 bit, ma è disponibile una versione non ufficiale che ho linkato sopra.

Ringraziamenti

Ringrazio il buon Lemonz per avermi introdotto al mondo di docker e avermi dato alcuni consigli nello scrivere questo tutorial, oltre a spiegarmi un po’ il funzionamento di PostgreSQL per i test della parte relativa ad esso.

2 pensieri su “Installare un server LAMP con Docker su Raspberry Pi

  1. Pingback: LAMP è un paradigma obsoleto? – Computer Blog

  2. Pingback: Going 64… (Installare Ubuntu Server su Raspberry Pi) – Computer Blog

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.