Come distribuire MySQL/MariaDB in Docker con archiviazione dati persistente
Introduzione
In questo tutorial, distribuisci un contenitore di database MySQL o MariaDB utilizzando Docker con archiviazione dati persistente. Eseguire database in contenitori semplifica la distribuzione, il controllo delle versioni e la portabilità tra ambienti. Alla fine di questo tutorial, avrai un'istanza MySQL o MariaDB pronta per la produzione in esecuzione in Docker con dati archiviati in modo sicuro al di fuori del contenitore.
Prerequisiti
Pubblico target: Amministratori di sistema intermedi
Tempo stimato per il completamento: ~30–45 minuti
Sistema Operativo
- Ubuntu 24.04 LTS (testato)
- Compatibile anche con: Ubuntu 22.04 LTS, Debian 12 / 13
Requisiti Software
- Docker 24.0.6 o successivo
- Docker Compose v2 (incluso con le installazioni moderne di Docker)
Controlla la tua versione di Docker:
docker --version
Output previsto: Docker version 24.0.6, build ed223bc
Controlla la versione di Docker Compose:
docker compose version
Output previsto: Docker Compose version v5.1.0
Se non hai Docker installato, lo installerai durante il Passo 1.
Requisiti Hardware
- Minimo 2 GB di RAM
- Almeno 10 GB di spazio libero su disco
Requisiti di Rete
- Porta 3306 disponibile (porta predefinita MySQL/MariaDB)
- Firewall configurato per consentire l'accesso solo se sono necessarie connessioni esterne
Permessi
- Un utente non root con privilegi
sudo - Utente aggiunto al gruppo
docker(consigliato)
Conoscenze Presunte
- Concetti base di Docker (immagini, contenitori, volumi)
- Confortevole con le operazioni da riga di comando
Passo 1: Installa e Verifica Docker
Se Docker non è installato, installalo:
sudo apt update && sudo apt upgrade -y && sudo apt install curl
curl -sSL https://get.docker.com/ | CHANNEL=stable bash
sudo apt install docker-ce docker-compose-plugin -y
Abilita e avvia Docker:
sudo systemctl enable docker
sudo systemctl start docker
Verifica che Docker sia in esecuzione:
sudo systemctl status docker
Risultato previsto: lo stato del servizio Docker mostra active (running).
Aggiungi il tuo utente al gruppo docker per evitare di usare sudo mentre usi Docker:
sudo usermod -aG docker <YOUR_USERNAME>
newgrp docker
Passo 2: Crea una Directory di Dati Persistente
Un bind mount mappa una directory dal sistema host direttamente in un contenitore, rendendola accessibile all'interno del filesystem del contenitore.
Crea una directory per i dati del database e imposta i permessi corretti:
mkdir -p ~/mysql-docker/data
chmod 750 ~/mysql-docker/data
Questa directory memorizzerà i file del database al di fuori del contenitore.
Senza archiviazione persistente, tutti i dati del database vengono persi quando il contenitore viene rimosso.
Passo 3: Crea una Configurazione Docker Compose
Vai alla tua directory di progetto:
cd ~/mysql-docker
Crea un file docker-compose.yml:
nano docker-compose.yml
Aggiungi la seguente configurazione (esempio MySQL):
services: mysql: image: mysql:8.0.36 container_name: mysql-server restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: <YOUR_STRONG_ROOT_PASSWORD> MYSQL_DATABASE: appdb MYSQL_USER: appuser MYSQL_PASSWORD: <YOUR_STRONG_USER_PASSWORD> ports: - "3306:3306" volumes: - ./data:/var/lib/mysql
Alternativa MariaDB — se preferisci MariaDB, usa:
services: mariadb: image: mariadb:11.3 container_name: mariadb-server restart: unless-stopped environment: MARIADB_ROOT_PASSWORD: <YOUR_STRONG_ROOT_PASSWORD> MARIADB_DATABASE: appdb MARIADB_USER: appuser MARIADB_PASSWORD: <YOUR_STRONG_USER_PASSWORD> ports: - "3306:3306" volumes: - ./data:/var/lib/mysql
Importante: Non codificare mai password reali nel controllo delle versioni. Usa variabili d'ambiente o un file .env in produzione. Sostituisci <YOUR_STRONG_USER_PASSWORD> e <YOUR_STRONG_ROOT_PASSWORD> con le tue password sicure.
Passo 4: Avvia il Contenitore del Database
Esegui:
docker compose up -d
Output previsto:
- Docker scarica l'immagine (se non già scaricata)
- Il contenitore si avvia in modalità staccata
Verifica lo stato del contenitore:
docker ps
Output previsto:
CONTAINER ID IMAGE STATUS PORTS abc123def456 mysql:8.0.36 Up 10 seconds 0.0.0.0:3306->3306/tcp
Passo 5: Verifica la Funzionalità del Database
Connettiti al Contenitore
Per il contenitore MySQL esegui:
docker exec -it mysql-server mysql -u root -p
Per il contenitore MariaDB esegui:
docker exec -it mariadb-server mysql -u root -p
Inserisci la tua password di root.
Risultato previsto: appare il prompt della shell MySQL: mysql>
Controlla i Database
SHOW DATABASES;
Dovresti vedere:
- appdb
- information_schema
- mysql
- performance_schema
- sys
EXIT;
Testa la Persistenza dei Dati
Crea una tabella di test
docker exec -it mysql-server mysql -u root -p
All'interno della shell MySQL inserisci i seguenti comandi:
USE appdb;
CREATE TABLE test_table (id INT PRIMARY KEY);
EXIT;
Ferma e rimuovi il contenitore
docker compose down
Riavvia il contenitore
docker compose up -d
Verifica che la tabella esista ancora
docker exec -it mysql-server mysql -u root -p
All'interno della shell MySQL inserisci i seguenti comandi:
USE appdb;
SHOW TABLES;
Risultato previsto: test_table appare. Questo conferma che l'archiviazione persistente funziona.
Passo 6: Proteggi la Distribuzione
Limita l'Accesso Esterno
Se l'accesso al database è necessario solo internamente, modifica le porte in docker-compose.yml:
ports: - "127.0.0.1:3306:3306"
Riavvia:
docker compose down
docker compose up -d
Importante: Evita di esporre pubblicamente la porta 3306 a meno che non sia assolutamente necessario.
Usa un File .env
Crea .env:
nano .env
Esempio:
MYSQL_ROOT_PASSWORD=<YOUR_STRONG_ROOT_PASSWORD> MYSQL_PASSWORD=<YOUR_STRONG_USER_PASSWORD>
Riferimento in docker-compose.yml:
environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_PASSWORD: ${MYSQL_PASSWORD}
Verifica
Puoi confermare che tutto funzioni correttamente:
- Eseguendo
docker ps— il contenitore è Up - Connettendoti tramite CLI MySQL — il login ha successo
- Riavviando il contenitore — i dati persistono
- Controllando i log:
docker logs mysql-server
Voci di log previste: "ready for connections".
Ripristino delle Modifiche
Per fermare e rimuovere il contenitore:
docker compose down
Per rimuovere i dati persistenti:
Importante: Questo elimina permanentemente tutti i dati del database.
rm -rf ~/mysql-docker/data
Per disinstallare Docker:
sudo apt remove docker-ce docker-compose-plugin -y
Risoluzione dei Problemi
Il Contenitore Non Si Avvia
Controlla i log:
docker logs mysql-server
Cause comuni:
- Password debole rifiutata
- Porta 3306 già in uso
Controlla l'uso della porta:
sudo ss -tulnp | grep 3306
Errori di Permesso
Se vedi errori di permesso negato:
sudo chown -R 999:999 ~/mysql-docker/data
999 è comunemente l'ID utente del contenitore MySQL.
Conclusione & Prossimi Passi
Hai distribuito con successo MySQL o MariaDB in Docker con archiviazione persistente. Il database ora funziona in un contenitore isolato mentre memorizza in modo sicuro i dati sul sistema host.
Prossimi passi:
- Configura backup automatici
- Implementa la replica per alta disponibilità
- Integra con contenitori applicativi
- Aggiungi monitoraggio con Prometheus e Grafana