Vai al contenuto

MySql e PHPMyAdmin su Docker

Docker è diventato ormai il framework più utilizzato per la creazione, l’esecuzione e la gestione di container sui server e sul cloud. I container forniscono un modo per creare un ambiente isolato, a volte chiamato sandbox, in cui possono “vivere” le applicazioni e le relative dipendenze. I container garantiscono la portabilità, coerenza e velocità, infatti l’ambiente isolato fa si che il container risulti disaccoppiato dall’ambiente in cui viene eseguito. Ciò significa che i container possono essere eseguiti in molti ambienti diversi con diversi sistemi operativi e piattaforme hardware con la garanzia che funzionino allo stesso modo indipendentemente da dove vengono distribuiti; Inoltre, a differenza delle macchine virtuali, i container tendono ad ridurre l’uso di  risorse in quanto un container può essere usato anche in altri container, ottimizzando gli spazi e i processi.

Tra le cose che possiamo creare su Docker, vi è senza dubbio un piccolo server MySQL, totalmente indipendente dall’architettura dell’host. Sappiamo benissimo che gestire MySQL da riga di comando può essere molto difficile, se non si conoscono i comandi e il linguaggio SQL. Motivo per cui si tende sempre a lavorare con un’interfaccia grafica. Lo strumento di amministrazione di MySQL preferito da tutti è senza dubbio phpMyAdmin, che supporta MySQL e MariaDB con un’ampia varietà di operazioni, come l’importazione di dati, l’esportazione di dati, l’esecuzione di istruzioni SQL e molte altre.

E’ chiaro che l’esecuzione e la gestione di phpMyAdmin su una macchina può diventare snervante per la gestione dell’ambiente (è necessario installare e configurare un webserver), quindi utilizzeremo Docker che, attraverso la sua tecnologia di containerizzazione, risolve qualsiasi problema di compatibilità e interoperabilità tra piattaforme.

MySQL attraverso Docker

Esistono due metodi per connettere phpMyAdmin con MySQL utilizzando Docker.
  • Il primo utilizza un singolo file di composizione Docker
  • Il secondo, utilizzeremo un contenitore MySQL Docker già in esecuzione

La prima cosa da fare è ovviamente installare Docker.

Metodo 1 (docker-compose.yml)

In questo metodo, utilizzeremo un file di composizione Docker. Il file docker-compose.yml altri non è che un semplice file di testo, che deve essere salvato all’interno di una cartella. Il nome della cartella utilizzata in questo esempio è phpMyAdmin. Il contenuto del file è questo:

version: '3.1'
services:
  db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_db
    ports:
      - "3308:3306"
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    restart: always
    environment:
      PMA_HOST: db
      PMA_USER: root
      PMA_PASSWORD: root
    ports:
      - "8080:80"

Innanzitutto, bisogna indicare attraverso il tag version il formato di file Compose, che in questo caso è 3.1. Esistono altri formati di file: 1, 2, 2.xe 3.x. Per maggiori informazioni sui formati di file di Compose consultare la documentazione di Docker qui.

Il tag version è seguito dall’hash services. All’interno di questo, definiamo i servizi che vogliamo utilizzare per la nostra applicazione. Per la nostra applicazione, abbiamo due servizi, db e phpmyadmin.

Per rendere il nostro processo di installazione rapido e semplice, utilizziamo l’immagine ufficiale predefinita di MySQL (mysql) e phpMyAdmin (phpmyadmin/phpmyadmin:latest).

Il tag restart definisce il criterio di riavvio per un contenitore. Il valore del tag restart può essere uno dei seguenti:

  • no Non riavviare automaticamente il contenitore (predefinito)
  • on-failure Riavvia il contenitore se viene prodotto un errore, che si manifesta come un codice di uscita diverso da zero
  • always Riavviare sempre il contenitore se si ferma. Se viene arrestato manualmente, viene riavviato solo quando il daemon Docker viene riavviato o il contenitore stesso viene riavviato manualmente
  • unless-stopped Simile a always, tranne per il fatto che quando il contenitore viene arrestato (manualmente o in altro modo), non viene riavviato anche dopo il riavvio del daemon Docker

Impostiamo always per il tag restart (per entrambi i servizi), in modo che il contenitore si riavvia sempre.

Subito sotto, abbiamo definito le variabili di ambiente sotto il tag environment, che useremo per il database e l’autenticazione phpMyAdmin.

Infine, il tag ports viene utilizzato per definire la mappatura delle porte dell’host che quelle del contenitore. Per il servizio db, viene mappata la porta 3308 sull’host con la porta 3306 sul contenitore MySQL. Per il servizio phpmyadmin, viene mappata la porta 8080 sull’host con la porta 80 sul contenitore phpMyAdmin.

Una volta impostato il file yml, si dovrà solamente eseguire all’interno della cartella ove è stato salvato il file yml il comando:

docker compose up

 A questo punto dovrebbe apparire qualcosa di simile, il che significa che Docker sta già scaricando i container necessari.

Se dovessimo riscontrare il seguente errore, significa che è già in esecuzione un container Docker sulla porta 3308. Per risolvere il problema, possiamo passare a una porta diversa oppure arrestare l’altro container.

Bind per 0.0.0.0:3308 non riuscito: la porta è già allocata

Se non riceviamo errori, MySQL e phpMyAdmin sono stati correttamente creati e possiamo già da subito utilizzarli. Se apriamo un qualsiasi browser e digitiamo l’URL http://localhost:8080dovremmo già vedere la home page di phpMyAdmin.

Metodo 2

Questo metodo è utile quando vogliamo connettere più container Docker a un container già esistente e in esecuzione. Questo metodo può essere utile, ad esempio, quando nel file docker-compose.yml, non si dispone del servizio phpMyAdmin, ma possiamo aggiungerlo successivamente.

Per iniziare, dobbiamo elencare tutte le attuali reti Docker utilizzando il seguente comando.

docker network ls

Nell’elenco che spuntam dovrebbe apparire la voce phpmyadmin_default. Il nostro obiettivo è trovare la rete dell’applicazione che abbiamo creato utilizzando il file docker-compose del metodo uno. Poiché non abbiamo specificato un nome di rete nel file docker-compose per la nostra applicazione, Docker fornirà il nome della rete in base al nome della directory con _default alla fine. In questo caso appunto, phpmyadmin_default.

Ora che abbiamo identificato con successo la rete, possiamo eseguire un contenitore Docker phpMyAdmin autonomo, connesso alla nostra rete desiderata.

docker run --name stand-alone-phpmyadmin --network phpmyadmin_default -p 8081:80 phpmyadmin/phpmyadmin:latest

Il comando docker run viene utilizzato per eseguire un contenitore da un’immagine. Qui stiamo usando l’ phpmyadmin/phpmyadmin:latestimmagine.

  • Il flag –name (facoltativo) viene utilizzato per assegnare un nome specifico al contenitore. Se non vuoi fornirne uno, Docker assegnerà un nome in modo casuale (utilizzando il nome di uno scienziato famoso).
  • Il flag –network viene utilizzato per connettersi a una rete Docker.
  • Il flag -p è la mappatura delle porte.

In un browser web qualsiasi digitiamo il seguente indirizzo http://localhost:8081/index.php. Le credenziali sono quelle impostate nel file compose del metodo uno, quindi username: root e password: root. Ecco che ci connetteremo allo stesso server MySQL definito con il metodo uno, ma utilizzando una nuova istanza di phpMyAdmin.