Come distribuire MySQL/MariaDB in Docker con archiviazione dati persistente | INTROSERV
EUR
european

EUR

usa

USD

Italy It
Ex. VAT Ex. VAT 0%

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

Tip

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.

Info

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

Info

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

Info

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:

Info

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

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA