Migrare MySQL 8.0 da Debian a Docker: guida completa con backup, utenti e permessi

Migrare MySQL 8.0 da Debian a Docker

Oggi vedremo come migrare MySQL 8.0 da Debian a Docker mantenendo utenti, permessi e dati. Ma perchè imbattersi in questa procedura? Ipotizziamo di avere un server che ospita una ben precisa versione di MySQL / MariaDB utilizzata da alcuni applicativi. C’è la possibilità che durante un upgrade di sistema operativo, venga aggiornata anche la versione MySQL rischiando di rompere i nostri applicativi. Bene, migrando la nostra istanza di MySQL / MariaDB in Docker, non saremo più dipendenti dalla versione del sistema operativo e non solo.

Intanto, di che cosa stiamo parlando?

MySQL è un sistema di gestione di database relazionali (RDBMS) open source tra i più utilizzati al mondo. Sviluppato originariamente da MySQL AB e oggi mantenuto da Oracle, si basa sul linguaggio SQL (Structured Query Language) per la gestione e l’interrogazione dei dati. È noto per la sua stabilità, velocità e semplicità d’uso, ed è ampiamente adottato in ambienti web, spesso come parte dello stack LAMP (Linux, Apache, MySQL, PHP). Grazie alla sua architettura modulare e alla compatibilità con numerosi linguaggi di programmazione, MySQL è adatto tanto a piccoli progetti quanto ad applicazioni enterprise di grandi dimensioni.

Docker è una piattaforma open source che consente di creare, distribuire ed eseguire applicazioni all’interno di container, ambienti isolati e leggeri che includono tutto il necessario per far funzionare un software: codice, librerie, configurazioni e dipendenze. A differenza delle macchine virtuali, i container condividono il kernel del sistema operativo, offrendo maggiore efficienza e portabilità. Grazie a Docker, è possibile garantire che le applicazioni si comportino allo stesso modo in qualsiasi ambiente, semplificando il deploy, la scalabilità e la manutenzione di sistemi complessi.

In questa guida andremo a trattare:

  1. Pro e contro della migrazione di MySQL su Docker
  2. Installazione di Docker e Docker Compose su Debian 12
  3. Preparazione alla migrazione di MySQL
  4. Creazione del file Docker Compose per MySQL
  5. Import dei dati e test del container
  6. Rimozione della vecchia installazione locale di MySQL
  7. Considerazioni finali e best practice

Pro e contro della migrazione di MySQL su Docker

La migrazione di MySQL su Docker, come ogni procedura,presenta vantaggi e svantaggi da valutare con attenzione.

Vantaggi principali:

  1. Isolamento e portabilità: Ogni container funziona in un ambiente separato, eliminando conflitti tra versioni o configurazioni. È possibile spostare facilmente il database tra server diversi mantenendo le stesse impostazioni.
  2. Aggiornamenti e rollback semplificati: Aggiornare MySQL diventa questione di cambiare un tag nel docker-compose.yml. Se qualcosa va storto, puoi tornare alla versione precedente in pochi secondi.
  3. Backup e ripristino più gestibili: Grazie ai volumi Docker, i dati sono separati dal container, semplificando backup e restore automatici.
  4. Ambienti di sviluppo uniformi: Tutti gli sviluppatori possono lavorare con la stessa versione di MySQL, riducendo i problemi di “funziona sul mio PC ma non in produzione”.

Svantaggi e criticità:

  1. Prestazioni leggermente inferiori: Su macchine con I/O intensivo, l’uso di volumi Docker o filesystem condivisi può introdurre una piccola latenza rispetto a un’installazione nativa.
  2. Gestione dei volumi: È necessario configurare correttamente i volumi per evitare la perdita dei dati quando il container viene ricreato.
  3. Debug e monitoraggio: Log, permessi e configurazioni possono risultare più complessi da gestire all’interno del container, specie in ambienti di produzione.
  4. Integrazione con altri servizi: In alcuni casi (replica, clustering, networking) serve una configurazione Docker più avanzata.

Installazione di Docker e Docker Compose su Debian 12

Prima di migrare MySQL in Docker, è necessario predisporre l’ambiente di containerizzazione installando Docker Engine e Docker Compose su Debian 12.

Prendiamo come esempio Debian 12 in quanto è la versione che attualmente gira sul mio server in cui ho eseguito questa procedura, ma teoricamente vale per ogni versione Debian e derivate.

Prima di procedere con l’installazione di Docker, dovremo andare a pulire il nostro sistema da eventuali versioni obsole del Docker Engine provenienti da repository di Debian.

Apriamo il terminale, assicurandoci di avere i permessi di root e lanciamo:

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

Possiamo dunque procedere all’aggiunta del Repository ufficiale di Docker, così da poter installare l’ultima versione disponibile. Sempre da terminale:

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt-get update

Dopo aver aggiunto il repository ufficiale alla nostra distribuzione, possiamo procedere all’installazione vera e propria dei paccheti necessari:

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Preparazione alla migrazione di MySQL

Procediamo quindi alla preparazione del backup della nostra istanza di MySQL. Per fare una procedura pulita e quindi non dover ricreare utenze e permessi nel nuovo database, andremo a fare il dump anche del database mysql, dove risiedono utenti e privilegi.

Sostituire root con la propria utenza di MySQL e nel caso in cui sia necessaria una password, aggiungere il parametro -p seguito subito dalla stessa password, senza lasciare spazi: -pPASSOWRD.

Apriamo il terminale e lanciamo il seguente comando che andrà a creare un dump di tutti i nostri dati:

mysqldump -u root --all-databases --routines --events --flush-privileges > /root/mysql_full_backup.sql
sudo systemctl stop mysql

Preparazione del file Docker Compose per MySQL

Una volta creato il backup completo, il passo successivo consiste nel configurare l’ambiente Docker che ospiterà MySQL. Con Docker Compose possiamo descrivere in modo semplice e leggibile tutti i parametri necessari: immagine, volume dati, porta e variabili d’ambiente.

Ipotizziamo di strutturare in questo modo le nostre cartelle per il progetto:

/docker
├── compose
│   └── mysql8.0.43
│       └── docker-compose.yml
└── mysql8
    └── data               ← volume dati montato da Docker

Ritorniamo sul nostro amato terminale e lanciamo i comandi per creare le dovute cartelle e per l’assegnazione dei vari permessi:

sudo mkdir -p /docker/compose/mysql8.0.43
sudo mkdir -p /docker/mysql8/data
sudo chown -R 999:999 /docker/mysql8/data
sudo chmod -R 750 /docker/mysql8/data
A questo punto possiamo creare il nostro file docker-compose.yml:
version: "3.9"
services:
  mysql:
    image: mysql:8.0.43
    container_name: mysql8
    restart: unless-stopped
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    ports:
      - "3306:3306"
    volumes:
      - /docker/mysql8/data:/var/lib/mysql

Avviamo docker-compose:

docker compose up -d

Nel caso in cui la vostra istanza di MySQL necessiti di una password, sarà necessario sostituire MYSQL_ALLOW_EMPTY_PASSWORD: "yes" con MYSQL_ROOT_PASSWORD: "LA PROPRIA PASSWORD".

Import dei dati e test del container

Una volta avviato il container MySQL, è il momento di importare il backup eseguito in precedenza e verificare che tutto sia stato ripristinato correttamente, inclusi utenti, permessi e routine.

Eseguiamo quindi la copia del nostro backup dentro al container ed eseguiamo l’import:

docker cp /root/mysql_full_backup.sql mysql8:/tmp/
docker exec -it mysql8 bash
mysql -u root < /tmp/mysql_full_backup.sql

Attendiamo che abbia completato l’import ( dipende dalla dimensione del vostro backup ) e controlliamo che sia tutto ok.

Assicuriamoci che vengano elencati tutti i database precedenti (incluso mysql, che contiene utenti e permessi).

mysql -u root -e "SHOW DATABASES;"

Pulizia della versione locale di MySQL

Ora che MySQL funziona correttamente in Docker, possiamo rimuovere l’installazione locale per evitare conflitti e liberare spazio.

sudo apt remove --purge -y mysql-server mysql-client mysql-common
sudo apt autoremove -y
sudo rm -rf /var/lib/mysql /etc/mysql

Considerazioni finali e best practice

Abbiamo completato la migrazione di MySQL all’interno di Docker, ottenendo un ambiente più flessibile e facile da gestire. Prima di concludere, è utile ricordare alcune buone pratiche per mantenere il sistema stabile e sicuro.

Gestione dei backup: In ambiente containerizzato, i backup restano fondamentali. Possiamo pianificare dump regolari con mysqldump oppure montare un volume dedicato ai backup automatici. È importante salvare i file di backup fuori dal volume principale di MySQL, per evitare la perdita simultanea dei dati e delle copie.

Sicurezza e accesso: Evitiamo di lasciare l’utente root senza password in ambienti di produzione.
Possiamo gestire gli accessi tramite:

  • variabile MYSQL_ROOT_PASSWORD o utenti applicativi dedicati;
  • restrizioni di rete (solo host specifici);
  • backup dei volumi con permessi corretti (999:999 per MySQL ufficiale).

La containerizzazione di MySQL consente di svincolare il database dal sistema operativo, semplificando aggiornamenti, restore e portabilità.

È una scelta particolarmente adatta a chi desidera ambienti coerenti, facilmente replicabili e pronti per l’automazione DevOps.

Con le giuste attenzioni a sicurezza e backup, Docker può diventare la soluzione ideale per gestire MySQL in modo moderno, stabile e indipendente.

 

Happy dev!