Ricerca nel sito web

Come configurare Nginx, MariaDB e PHP con Docker Compose


Questa guida ti mostra come configurare il tuo stack LEMP (Nginx, MariaDB, PHP) in modo facile e veloce utilizzando Docker Compose.

Quando si tratta di sviluppo di applicazioni, i contenitori rappresentano ora l’approccio standard. Sono popolari tra gli sviluppatori di software grazie alla loro flessibilità e portabilità.

Lo stack LEMP è una soluzione open source utilizzata per sviluppare applicazioni web. È un acronimo che rappresenta Linux, Nginx, MySQL/MariaDB e PHP. Inoltre, è ampiamente popolare e ben supportato nella comunità Open Source.

Tuttavia, l'installazione e la configurazione di tutti questi servizi richiedono tempo e competenze. È qui che entrano in gioco i contenitori Docker, in particolare Docker Compose. Con il suo aiuto, puoi avere il tuo LEMP installato e funzionante in pochi minuti e concentrarti interamente sullo sviluppo di app Web senza perdere tempo nell'installazione e nella configurazione dei servizi.

Ma se preferisci ancora adottare l'approccio tradizionale e installare lo stack LEMP dai pacchetti nativi per la distribuzione che stai utilizzando, i nostri tutorial per Ubuntu, Debian, Rocky Linux e AlmaLinux ti aiuteranno a farlo senza sforzo.

Questa guida ti mostrerà come integrare rapidamente e facilmente Nginx, MariaDB e PHP utilizzando Docker Compose. Inoltre, aggiungeremo la popolare applicazione basata sul web phpMyAdmin allo stack LEMP per gestire il tuo database MySQL/MariaDB.

Quindi, senza ulteriori indugi, mettiamoci al lavoro.

Prerequisiti

Naturalmente, per distribuire uno stack LEMP containerizzato è necessario avere Docker e Docker Compose installati. Pertanto, se non hai già installato Docker, una delle seguenti guide potrebbe essere utile:

  • Come installare Docker su Ubuntu 22.04
  • Come installare Docker su Debian 11 (Bullseye)
  • Come installare Docker su AlmaLinux/Rocky Linux
  • Come installare Docker su Fedora
  • Come installare Docker su Raspberry Pi

L'altro componente essenziale è Docker Compose. Ricorda, viene fornito separatamente da Docker. Pertanto, è necessario installare Docker prima di aggiungere Docker Compose; in caso contrario, Compose non funzionerà.

Fortunatamente, anche se non è già presente sul tuo sistema Linux, installarlo è piuttosto semplice. Digita i seguenti comandi:

sudo curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-linux-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Successivamente, esegui il comando seguente per assicurarti che Docker Compose sia installato e funzioni correttamente. Dovresti ricevere una risposta simile a quella mostrata.

docker-compose version

Sembra tutto a posto, quindi passiamo alla parte vera e propria.

Configura Nginx, MariaDB e PHP con Docker Compose

Docker Compose ti consente di creare ed eseguire stack di più contenitori. In altre parole, è uno strumento per definire ed eseguire applicazioni Docker multi-contenitore.

Per utilizzarlo, devi prima creare un file "docker-compose.yml" che configura i contenitori per la tua applicazione. Quindi, puoi utilizzare un singolo comando come "docker-compose up" per avviare tutti i contenitori e collegarli insieme.

Iniziamo creando la struttura di directory per ospitare i file necessari per configurare Nginx, MariaDB e PHP con Docker Compose. La versione finale dovrebbe assomigliare a quella mostrata di seguito e ora spiegheremo cosa rappresenta ciascun file e directory.

Usiamo un nome arbitrario per la directory principale, come “lemp”. Memorizzerà tutti i file richiesti per la configurazione, quindi creiamolo.

mkdir lemp

Quindi creiamo due sottodirectory al suo interno: “nginx-conf” e “php-files”.

mkdir lemp/{nginx-conf,php-files}

La directory "nginx-conf" conterrà il file di configurazione principale del nostro server Web Nginx modificato, che creeremo in seguito. Infine, i “file php”, come suggerisce il nome, hanno lo scopo di archiviare gli script PHP che l'applicazione che stiamo sviluppando dovrà eseguire.

È importante notare che abbiamo scelto arbitrariamente tutti questi nomi di directory. Ma, ovviamente, sei libero di usarne di diversi.

Continuiamo a creare il nostro file master che descrive tutti i servizi nel nostro stack LEMP containerizzato. Crea un file denominato "docker-compose.yml" all'interno della directory "lemp" con il tuo editor di testo preferito:

cd lemp
vim docker-compose.yml

Aggiungi il seguente contenuto:

version: '3.8'
Services
services:

    # PHP Service
    php:
        build:
            dockerfile: php-dockerfile
        volumes:
            - './php-files:/var/www/html'
        depends_on:
            - mariadb

    # Nginx Service
    nginx:
        image: nginx:latest
        ports:
            - 80:80
        links:
            - 'php'
        volumes:
            - './php-files:/var/www/html'
            - './nginx-conf:/etc/nginx/conf.d'
        depends_on:
            - php

    # MariaDB Service
    mariadb:
        image: mariadb:10.9
        environment:
            MYSQL_ROOT_PASSWORD: your_password
        volumes:
            - mysqldata:/var/lib/mysql

    # phpMyAdmin Service
    phpmyadmin:
        image: phpmyadmin/phpmyadmin:latest
        ports:
            - 8080:80
        environment:
            PMA_HOST: mariadb
        depends_on:
            - mariadb
Volumes
volumes:

  mysqldata:

Salva e chiudi il file. Non preoccuparti se qualcosa nel suo contenuto non ti è chiaro. Lo esamineremo più dettagliatamente di seguito.

Servizio PHP

Inizieremo con PHP, il primo servizio nel nostro file "docker-compose.yml". Il punto chiave qui è la direttiva “build”, che afferma “dockerfile: php-dockerfile”.

Come puoi vedere, qui non esiste alcun percorso per un'immagine Docker. Questo perché ne costruiremo uno nostro, le cui istruzioni possono essere trovate nel file "php-dockerfile".

Potresti chiederti perché dobbiamo creare la nostra immagine Docker per PHP invece di usarne una già disponibile su Docker Hub. La risposta è semplice: l'immagine ufficiale include un set limitato di estensioni PHP preinstallate. Sfortunatamente, nella maggior parte dei casi, sono insufficienti per le applicazioni che intendiamo sviluppare.

Pertanto, creeremo una nuova immagine Docker basata su quella ufficiale PHP 8.1, ma inoltre compileremo e includeremo alcune delle estensioni PHP più utilizzate, come MySQL, GD, ZIP e così via.

Quindi, crea un file denominato “php-dockerfile” nella directory “lemp” con il tuo editor di testo preferito e aggiungivi il seguente contenuto:

vim php-dockerfile
FROM php:8.1-fpm
Installing dependencies for the PHP modules
RUN apt-get update && \
    apt-get install -y zip libzip-dev libpng-dev
Installing additional PHP modules
RUN docker-php-ext-install mysqli pdo pdo_mysql gd zip

Salva e chiudi il file. Naturalmente, come hai intuito, se hai bisogno di più estensioni PHP, puoi includerle nel file.

La seguente direttiva, "volumes", specifica dove l'app memorizzerà i nostri file PHP. Come sai, i contenitori Docker sono temporanei e si prevede che tutti i dati andranno persi quando il contenitore viene eliminato. Fortunatamente, i volumi Docker forniscono un meccanismo per rendere persistenti i dati creati all'interno di un contenitore.

Pertanto, la nostra directory “php-files” punta a “/var/www/html” nel contenitore PHP, che è dove PHP cerca gli script PHP eseguibili.

Creeremo al suo interno un file "index.php", che verrà utilizzato solo per i test.

vim php-files/index.php

Aggiungi la singola riga mostrata di seguito, quindi salva ed esci dal file.

<?php phpinfo(); ?>

La direttiva “depends_on” indica al nostro contenitore PHP di attendere fino all'avvio di MariaDB. Lo facciamo perché ci aspettiamo che PHP tenti di connettersi al database; quindi, deve prima essere operativo.

Servizio Nginx

Qui le cose sono decisamente più semplici. Utilizziamo l'immagine Docker più recente ed esponiamo la porta 80 del contenitore alla porta 80 del nostro sistema Linux locale. La direttiva “links” è un modo per connettere il contenitore Nginx a quello su PHP. In altre parole, consente di definire alias aggiuntivi attraverso i quali un servizio è raggiungibile da un altro servizio.

Ancora una volta, specifichiamo la directory “php-files”, in modo che il server Nginx sappia dove cercare i file richiesti. La parte interessante è nel secondo volume, dove definiamo “./nginx-conf:/etc/nginx/conf.d”. Questo è il file di configurazione principale del server web Nginx.

Lo facciamo poiché Nginx deve imparare a lavorare con i file PHP per impostazione predefinita. Pertanto, dobbiamo prima aggiungere la configurazione necessaria a questa funzionalità.

All'interno della directory "nginx-conf", crea un file denominato "nginx.conf" e incolla al suo interno il seguente contenuto:

vim nginx-conf/nginx.conf
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    
    server_name localhost;

    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~* \.php$ {
        fastcgi_pass php:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    }
}

Infine, salva ed esci dal file.

Ancora una volta, diciamo al contenitore Nginx di attendere prima l'avvio di PHP perché dipende da esso.

Inoltre, se vuoi acquisire maggiore familiarità con i blocchi server di Nginx, ti sarà utile anche la nostra pratica guida “Come creare un host virtuale Nginx (blocco server)”.

Servizio MariaDB

La configurazione Docker Compose del nostro server MariaDB è semplice. Tutto ciò che devi fare è sostituire la direttiva “MYSQL_ROOT_PASSWORD”, “your_password”, con quella che scegli. Come suggerisce il nome, questa è la password per l'account root di MariaDB.

La direttiva "volumes" ci assicura che non perderemo i dati nel nostro database durante il riavvio del contenitore. Questo è tutto ciò di cui abbiamo bisogno per il nostro contenitore MariaDB.

Servizio phpMyAdmin

Il contenitore finale nella nostra distribuzione Docker Compose è phpMyAdmin. Poiché non è necessario per il funzionamento dello stack LEMP, semplifica notevolmente l'amministrazione di MariaDB, motivo per cui lo includiamo nella nostra distribuzione.

Specifichiamo che phpMyAdmin sia accessibile sulla porta 8080 perché abbiamo già esposto la porta 80 al contenitore Nginx sul nostro sistema Linux locale.

La direttiva “PMA_HOST: mariadb” indica al contenitore phpMyAdmin a quale database connettersi, in questo caso, il nostro contenitore MariaDB.

Avvia ed esegui lo stack LEMP con Docker Compose

Finalmente siamo pronti per eseguire Nginx, MariaDB, PHP e phpMyAdmin utilizzando Docker Compose. Per fare ciò, esegui il comando indicato di seguito dalla directory "lemp" in cui si trova il nostro file "docker-compose.yml".

Avvia ed esegui i contenitori in background:

docker-compose up -d

Verrà avviato il download delle immagini e durante il processo verrà ricreata l'immagine Docker PHP, inclusi i moduli aggiuntivi.

L'intera procedura richiederà alcuni minuti, a seconda della velocità della tua connessione internet. Alla fine, dovresti vedere una schermata simile a quella qui sotto, che ti informa che tutti i contenitori sono stati avviati con successo.

Naturalmente il ritardo prima dell'effettivo avvio dei container Nginx, MariaDB, PHP e phpMyAdmin utilizzando Docker Compose sarà solo la prima volta perché è necessario scaricare le immagini da Internet.

Tutte le esecuzioni successive richiederanno pochi secondi poiché le immagini Docker sono disponibili localmente sul tuo sistema Linux.

Ora puoi aprire il browser e accedere a http://localhost. Il file "index.php" che abbiamo preparato nella directory "php-files" ti darà il benvenuto.

Puoi anche raggiungere la tua istanza phpMyAdmin containerizzata all'indirizzo http://localhost:8080.

È tempo di congratularsi con te stesso per un lavoro ben fatto!

Infine, permettici di guidarti attraverso i comandi Docker Compose essenziali per la gestione del tuo stack LEMP containerizzato.

Comandi di composizione di base della Docker

I comandi di base di Docker Compose che puoi utilizzare nella pratica sono mostrati di seguito con esempi. Ricordatevi di eseguirli dalla directory contenente il file “docker-compose.yml”.

Elenca tutti i contenitori Docker

Per visualizzare un elenco di tutti i contenitori attualmente in esecuzione nella distribuzione LEMP, digitare:

docker-compose ps

Arresta tutti i contenitori Docker

Per arrestare tutti i contenitori docker in esecuzione in background, utilizzare il comando come mostrato di seguito:

docker-compose stop

Naturalmente, puoi fermare solo uno dei contenitori nel tuo stack LEMP anziché tutti. A tale scopo, esegui "docker-compose stop" seguito dal nome del servizio. Notare non il nome del contenitore ma il nome del servizio.

Ad esempio, per arrestare il contenitore Nginx, eseguire:

docker-compose stop nginx

Allo stesso modo, puoi eseguirlo nuovamente in un secondo momento eseguendo "docker-compose start nginx".

Avvia tutti i contenitori Docker

Dalla directory del tuo progetto ("lemp"), avvia la tua applicazione eseguendo il comando come mostrato di seguito:

docker-compose start

Visualizza i log dei contenitori

Il comando docker-compose logs visualizza l'output del log dai servizi. Ad esempio, esegui il comando seguito dal nome del servizio per visualizzare i log del contenitore Nginx.

docker-compose logs nginx

Inoltre, se desideri aggregare i log di ogni contenitore nel tuo stack LEMP e tenere traccia di ciò che accade al loro interno in tempo reale, digita:

docker-compose logs -f

Ferma e distruggi i contenitori

Il comando seguente arresta e rimuove contenitori e reti creati dal comando "docker-compose up":

docker-compose down

Inoltre, se desideri arrestare e rimuovere i contenitori e le immagini Docker associate, utilizza il comando seguente:

docker-compose down --rmi all

Accesso al contenitore Docker

L'ultimo scenario che presenteremo non è direttamente correlato a Docker Compose, ma è utile quando si controlla cosa sta succedendo all'interno del contenitore.

Ad esempio, supponiamo di voler entrare all'interno del contenitore Nginx. Innanzitutto, esegui il comando seguente per elencare tutti i contenitori Docker in esecuzione e individuare l'ID contenitore del contenitore di destinazione nella colonna "ID CONTAINER".

docker ps

Ora sappiamo che l'ID del contenitore Nginx è e11b19b64acb. Ora puoi entrare nel contenitore accedendo alla sua shell eseguendo:

docker exec -it e11b19b64acb /bin/sh

Conclusione

La configurazione di Nginx, MariaDB e PHP (stack LEMP) con Docker Compose può semplificare notevolmente la distribuzione di applicazioni web. Fornisce un modo per definire e gestire più contenitori Docker come un'unica applicazione, semplificandone la manutenzione e la scalabilità. Inoltre, Docker Compose consente agli sviluppatori di gestire la configurazione di più servizi in un unico posto, risparmiando molto tempo e fatica.

Questa guida ti guida attraverso tutti i passaggi necessari per configurare e dockerizzare Nginx, MariaDB e PHP utilizzando Docker Compose, che ti offre grande flessibilità durante lo sviluppo di applicazioni web.

Consulta la documentazione ufficiale del progetto per saperne di più su Docker Compose.

Speriamo di esserti stati utili. Eventuali commenti o suggerimenti sono benvenuti nella sezione commenti qui sotto.

Articoli correlati: