Docker LEMP · 7 min read · Sep 24, 2025

Dockerizzare il LEMP Stack con Docker-Compose su Ubuntu

Docker-Compose è uno strumento da riga di comando per definire e gestire applicazioni docker multi-contenitore. Compose è uno script python, può essere installato facilmente con il comando pip (pip è il comando per installare software Python dal repository dei pacchetti python). Con compose, possiamo eseguire più contenitori docker con un singolo comando. Ti consente di creare un contenitore come servizio, ottimo per il tuo ambiente di sviluppo, test e staging.

In questo tutorial, ti guiderò passo dopo passo nell’utilizzo di docker-compose per creare un ambiente LEMP Stack (LEMP = Linux - Nginx - MySQL - PHP). Eseguiremo tutti i componenti in diversi contenitori Docker, impostiamo un contenitore Nginx, un contenitore PHP, un contenitore PHPMyAdmin e un contenitore MySQL/MariaDB.

Prerequisiti

  • Server Ubuntu 16.04 -64bit
  • Privilegi di root

Passo 1 - Installare Docker

In questo passo, installeremo Docker. Docker è disponibile nel repository di Ubuntu, basta aggiornare il tuo repository e poi installarlo.

Aggiorna il repository ubuntu e aggiorna:

sudo apt-get update  
sudo apt-get upgrade

Installa l’ultima versione di Docker dal repository ubuntu.

sudo apt-get install -y docker.io

Avvia docker e abilitalo per avviarsi all’avvio:

systemctl start docker  
systemctl enable docker

I servizi Docker sono in esecuzione.

Successivamente, puoi provare a utilizzare docker con il comando qui sotto per testarlo:

docker run hello-world

Hello world da docker.

Hello Docker

Passo 2 - Installare Docker-Compose

Nel primo passo, abbiamo già installato Docker. Ora installeremo docker-compose.

Abbiamo bisogno di python-pip per l’installazione di compose, installa python e python-pip con apt:

sudo apt-get install -y python python-pip

Quando l’installazione è terminata, installa docker-compose con il comando pip.

pip install docker-compose

Ora controlla la versione di docker-compose:

docker-compose --version

Docker-compose è stato installato.

Passo 3 - Creare e Configurare l’Ambiente Docker

In questo passo, costruiremo il nostro ambiente docker-compose. Utilizzeremo un utente non root, quindi dobbiamo creare quell’utente ora.

Aggiungi un nuovo utente chiamato ‘ hakase ‘ (scegli il tuo nome utente qui se vuoi):

useradd -m -s /bin/bash hakase  
passwd hakase

Successivamente, aggiungi il nuovo utente al gruppo ‘ docker ‘ e riavvia docker.

usermod -a -G docker hakase  
sudo systemctl restart docker

Ora l’utente ‘ hakase ‘ può utilizzare docker senza sudo.

Successivamente, dall’utente root, accedi all’utente ‘hakase’ con su.

su - hakase

Crea una nuova directory per l’ambiente compose.

mkdir lemp-compose/  
cd lemp-compose/

Questo è il nostro ambiente docker-compose, tutti i file che devono essere nel contenitore Docker devono trovarsi in questa directory. Quando utilizziamo docker-compose, abbiamo bisogno di un file .yml chiamato ‘ docker-compose.yml ‘.

Nella directory ‘lemp-compose’, crea alcune nuove directory e un file docker-compose.yml:

touch docker-compose.yml  
mkdir -p {logs,nginx,public,db-data}
  • logs: Directory per i file di log di Nginx.
  • nginx: contiene la configurazione di Nginx come host virtuale ecc.
  • public: directory per i file web, index.html e file di informazioni PHP.
  • db-data: volume della directory dei dati di MariaDB.

Crea i file di log error.log e access.log nella directory ‘ logs ‘.

touch logs/{error,access}.log

Crea un nuovo file di configurazione dell’host virtuale nginx nella directory ‘ nginx ‘:

vim nginx/app.conf

Incolla la configurazione qui sotto:

upstream php {  
        server phpfpm:9000;  
}  
   
server {  
   
        server_name 193.70.36.50;  
   
        error_log "/opt/bitnami/nginx/logs/myapp-error.log";  
        access_log  "/opt/bitnami/nginx/logs/myapp-access.log";  
   
        root /myapps;  
        index index.php index.html;  
   
        location / {  
   
                try_files $uri $uri/ /index.php?$args;  
        }  
   
        location ~ \.php$ {  
   
                include fastcgi.conf;  
                fastcgi_intercept_errors on;  
                fastcgi_pass php;  
        }  
   
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {  
                expires max;  
                log_not_found off;  
        }  
}

Salva il file ed esci da vim.

Crea un nuovo file index.html e un file di informazioni PHP nella directory ‘ public ‘.

echo '

LEMP Docker-Compose

hakase-labs' > public/index.html echo '' > public/info.php

Ora puoi vedere la directory dell’ambiente come mostrato qui sotto:

tree

Ambiente del progetto Docker compose

Passo 4 - Configurazione del file docker-compose.yml

Nel passo precedente, abbiamo creato le directory e i file necessari per i nostri contenitori. In questo passo, vogliamo modificare il file ‘ docker-compose.yml ‘. Nel file docker-compose.yml, definiremo i nostri servizi per il LEMP stack, le immagini di base per ogni contenitore e i volumi docker.

Accedi all’utente ‘ hakase ‘ e modifica il file docker-compose.yml con vim:

su - hakase  
cd lemp-compose/  
vim docker-compose.yml

- Definire i servizi Nginx

Incolla la configurazione nginx qui sotto:

nginx:  
    image: 'bitnami/nginx'  
    ports:  
        - '80:80'  
    links:  
        - phpfpm  
    volumes:  
        - ./logs/access.log:/opt/bitnami/nginx/logs/myapp-access.log  
        - ./logs/error.log:/opt/bitnami/nginx/logs/myapp-error.log  
        - ./nginx/app.conf:/bitnami/nginx/conf/vhosts/app.conf  
        - ./public:/myapps

In quella configurazione, abbiamo già definito:

  • nginx: nome del servizio
  • image: stiamo utilizzando le immagini docker ‘ bitnami/nginx
  • ports: espone la porta del contenitore 80 alla porta host 80
  • links: collega il contenitore del servizio ‘ nginx ‘ al contenitore ‘ phpfpm
  • volumes: monta directory locali nel contenitore. Monta la directory dei file di log, monta la configurazione dell’host virtuale di Nginx e monta la directory radice web.

- Definire i servizi PHP-fpm

Incolla la configurazione qui sotto il blocco Nginx:

phpfpm:  
    image: 'bitnami/php-fpm'  
    ports:  
        - '9000:9000'  
    volumes:  
        - ./public:/myapps

Abbiamo definito qui:

  • phpfpm: definire il nome del servizio.
  • image: definire l’immagine di base per il servizio phpfpm con l’immagine ‘ bitnami/php-fpm ‘.
  • ports: Stiamo eseguendo PHP-fpm con la porta TCP 9000 ed esponendo la porta 9000 all’host.
  • volumes: monta la directory radice web ‘ public ‘ su ‘ myapps ‘ nel contenitore. - Definire il servizio MySQL

Nel terzo blocco, incolla la configurazione qui sotto per il contenitore del servizio MariaDB:

mysql:  
    image: 'mariadb'  
    ports:  
        - '3306:3306'  
    volumes:  
        - ./db-data:/var/lib/mysql  
    environment:  
        - MYSQL_ROOT_PASSWORD=hakase-labs123

Qui puoi vedere che stiamo usando:

  • mysql: come nome del servizio.
  • image: il contenitore è basato sulle immagini docker ‘ mariadb ‘.
  • ports: il contenitore del servizio utilizza la porta 3306 per la connessione MySQL, ed è esposto all’host sulla porta 3306.
  • volumes: directory db-data mysql
  • environment: imposta la variabile di ambiente ‘ MYSQL_ROOT_PASSWORD ‘ per la password root mysql per le immagini docker, eseguita durante la costruzione del contenitore.

- Configurazione dei servizi PHPMyAdmin

Nell’ultimo blocco, incolla la configurazione qui sotto:

phpmyadmin:  
    image: 'phpmyadmin/phpmyadmin'  
    restart: always  
    ports:  
       - '8080:80'  
    links:  
        - mysql:mysql  
    environment:  
        MYSQL_USERNAME: root  
        MYSQL_ROOT_PASSWORD: hakase-labs123  
        PMA_HOST: mysql

Stiamo utilizzando un’immagine docker ‘phpmyadmin’, mappando la porta del contenitore 80 a 8080 sull’host, collegando il contenitore al contenitore mariadb, impostando il riavvio sempre e impostando alcune variabili di ambiente dell’immagine docker, incluso l’impostazione di ‘ PMA_HOST ‘.

Salva il file ed esci da vim.

Puoi vedere un esempio completo su github.

Passo 5 - Eseguire Docker-Compose

Ora siamo pronti per eseguire docker-compose. Nota: quando vuoi eseguire docker-compose, devi essere nella directory del progetto docker-compose e assicurarti che ci sia il file yml con la configurazione compose.

Esegui il comando qui sotto per avviare il LEMP stack:

docker-compose up -d

-d: esegui come daemon o in background

Vedrai il risultato che i nuovi contenitori sono stati creati, controllalo con il comando qui sotto:

docker-compose ps

esecuzione docker-compose

Ora abbiamo quattro contenitori in esecuzione Nginx, PHP-fpm, MariaDB e PHPMyAdmin.

Passo 6 - Test

Controlla le porte utilizzate dal docker-proxy sull’host.

netstat -plntu

tutte le porte docker mappate all'host

Possiamo vedere la porta 80 per il contenitore Nginx, la porta 3306 per il contenitore MariaDB, la porta 9000 per il contenitore php-fpm e la porta 8080 per il contenitore PHPMyAdmin.

Accedi alla porta 80 dal browser web, e vedrai il nostro file index.html.

http://serverip-address/

Assicurati che PHP-fpm sia in esecuzione, accedilo dal browser web.

http://serverip-address/info.php

contenitore docker php-fpm è in funzione

Accedi al contenitore MySQL nella shell MySQL.

docker-compose exec mysql bash  
mysql -u root -p  
TYPE MYSQL PASSWORD: hakase-labs123

Ora crea un nuovo database:

create database hakase_db;  
exit

La shell mysql di MariaDB è accessibile, e abbiamo creato un nuovo database ‘ hakase_db ‘.

accesso alla shell mysql contenitore docker

Successivamente, accedi a PHPMyAdmin sulla porta 8080: http://serverip-address:8080/.

Vedrai la pagina di accesso di PHPMyAdmin, basta digitare il nome utente ‘ root ‘ e la password è ‘ hakase-labs123 ‘.

contenitore docker phpmyadmin

Sarai automaticamente connesso al contenitore mysql che è stato definito nella variabile di ambiente PMA_HOST.

Clicca su ‘ Go ‘ e vedrai il dashboard di phpmyadmin che è connesso al contenitore ‘ mysql ‘.

phpmyadmin e contenitore mysql stanno funzionando

Successo! Il LEMP Stack è in esecuzione sotto un setup docker-compose, composto da quattro contenitori.

Riferimenti

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.