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 upgradeInstalla l’ultima versione di Docker dal repository ubuntu.
sudo apt-get install -y docker.ioAvvia docker e abilitalo per avviarsi all’avvio:
systemctl start docker
systemctl enable dockerI servizi Docker sono in esecuzione.
Successivamente, puoi provare a utilizzare docker con il comando qui sotto per testarlo:
docker run hello-worldHello world da 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-pipQuando l’installazione è terminata, installa docker-compose con il comando pip.
pip install docker-composeOra controlla la versione di docker-compose:
docker-compose --versionDocker-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 hakaseSuccessivamente, aggiungi il nuovo utente al gruppo ‘ docker ‘ e riavvia docker.
usermod -a -G docker hakase
sudo systemctl restart dockerOra l’utente ‘ hakase ‘ può utilizzare docker senza sudo.
Successivamente, dall’utente root, accedi all’utente ‘hakase’ con su.
su - hakaseCrea 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}.logCrea un nuovo file di configurazione dell’host virtuale nginx nella directory ‘ nginx ‘:
vim nginx/app.confIncolla 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
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:/myappsIn 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:/myappsAbbiamo 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-labs123Qui 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: mysqlStiamo 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
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
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.
Assicurati che PHP-fpm sia in esecuzione, accedilo dal browser web.
http://serverip-address/info.php

Accedi al contenitore MySQL nella shell MySQL.
docker-compose exec mysql bash
mysql -u root -p
TYPE MYSQL PASSWORD: hakase-labs123Ora crea un nuovo database:
create database hakase_db;
exitLa shell mysql di MariaDB è accessibile, e abbiamo creato un nuovo database ‘ hakase_db ‘.

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

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

Successo! Il LEMP Stack è in esecuzione sotto un setup docker-compose, composto da quattro contenitori.
Riferimenti
- https://hub.docker.com/r/bitnami/nginx/
- https://hub.docker.com/r/bitnami/php-fpm/
- https://hub.docker.com/_/mariadb/
- https://hub.docker.com/r/phpmyadmin/phpmyadmin/
- https://docs.docker.com/compose/
- https://github.com/yuzukiseo/hakase-labs/tree/master/lemp-compose
- https://www.howtoforge.com/tutorial/how-to-create-docker-images-with-dockerfile/
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.