Se non conosci MySQL o qualcuno che desidera installare il database MySQL in modo rapido e semplice, allora questo articolo è per te. In questo articolo impareremo come configurare MySQL con Docker e Docker Compose in Linux.
Iniziamo configurando l'ambiente Docker per avviare il contenitore MySQL.
1. Installa Docker
Prima di avviare il contenitore docker MySQL, è necessario che docker e docker-compose siano installati nel computer. Se non hai installato docker e docker-compose, fai riferimento alle seguenti guide:
- Come installare Docker in CentOS
- Come installare Docker in Ubuntu
Puoi anche fare riferimento ai collegamenti alla documentazione Docker ufficiale indicati di seguito per sapere come configurare Docker e Docker Compose.
- https://docs.docker.com/engine/install/
- https://docs.docker.com/compose/install/
Puoi eseguire i seguenti comandi per controllare la finestra mobile e le versioni di composizione mobile con cui stai eseguendo.
$ docker --version Docker version 20.10.11, build dea9396
$ docker-compose --version docker-compose version 1.29.2, build unknown
2. Scarica l'immagine Docker MySQL
Vai all'Hub Docker per ottenere l'immagine della finestra mobile MySQL . L'importante è decidere quale versione di MySQL eseguire.
Esegui il comando seguente per eseguire il pull dell'immagine MySQL dall'hub Docker al tuo computer.
$ docker pull mysql:latest
Avviso :Non è necessario utilizzare il tag "latest
", per impostazione predefinita estrarrà l'ultima immagine.
Per verificare se l'immagine è disponibile localmente, puoi eseguire il comando seguente:
$ docker images mysql
Risultato di esempio:
REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest b05128b000dd 12 days ago 516MB
Ora l'immagine è pronta per far girare il contenitore. Puoi anche saltare questo passaggio ed eseguire "docker run
" comando come mostrato nella sezione successiva che estrarrà l'immagine se non disponibile localmente.
3. Avvia MySQL Container
Esegui il comando seguente per avviare il contenitore Docker MySQL:
$ docker run --name mysql -p 3306:3306 -v mysql_volume:/var/lib/mysql/ -d -e "MYSQL_ROOT_PASSWORD=temp123" mysql
Analizziamo il comando precedente e vediamo cosa fa ogni flag.
--name
→ Per dare un nome al tuo contenitore. Se non stai specificando questo flag, Docker assegnerà alcuni nomi generati casualmente.
-p
→ Mappatura delle porte. MySQL ascolterà sulla porta 3306
quindi stiamo mappando le porte (3306
→ 3306
) dal computer host al contenitore Docker. Non è necessario che la porta host sia 3306
, può essere qualsiasi cosa disponibile per essere utilizzata.
Esegui il seguente netstat
comando nella tua macchina locale per verificare se la porta mappata è in ascolto o meno una volta avviato il container.
$ netstat -tlnup | grep -i 3306
Risultato di esempio:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 168870/docker-proxy tcp6 0 0 :::3306 :::* LISTEN 168878/docker-proxy
-v
→ Attacca un volume al contenitore. Il comportamento predefinito della finestra mobile è che non persisterà i dati una volta rimosso il contenitore, quindi perderai tutti i tuoi dati.
Per creare una memoria persistente, ho creato un volume denominato "mysql_volume
". MySQL memorizza i dati in /var/lib/mysql/
all'interno del contenitore e qui è mappato alla directory localhost /var/lib/docker/volumes/mysql_volume1/_data
, quindi i tuoi dati saranno persistenti.
Se desideri saperne di più sui volumi docker, dai un'occhiata al nostro articolo dettagliato sullo stesso.
-d
→ Avvierà ed eseguirà il contenitore in modalità scollegata. Se ometti -d
flag, quindi vedrai i log di avvio del contenitore nel terminale e dovrai aprire una nuova sessione del terminale per connetterti al contenitore.
-e
→ Variabili ambientali. Devi impostare la password utente root di MySQL utilizzando uno dei parametri seguenti.
MYSQL_ROOT_PASSWORD
→ Imposta la tua password utilizzando questa variabile di ambiente.MYSQL_ALLOW_EMPTY_PASSWORD
→ Verrà impostata una password vuota o nulla. Devi impostareMYSQL_ALLOW_EMPTY_PASSWORD=1
.MYSQL_RANDOM_ROOT_PASSWORD
→ verrà generata una password casuale all'avvio del container. Devi impostareMYSQL_RANDOM_ROOT_PASSWORD=1
per generare la password casuale.
Se salti questo passaggio, verrà generato un errore come mostrato di seguito.
4. Controlla lo stato del contenitore MySQL
Puoi controllare lo stato del contenitore avviato utilizzando il seguente comando:
$ docker ps
Risultato di esempio:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e1fb895f6f0f mysql "docker-entrypoint.s..." 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
5. Collegati al database MySQL
Esegui il comando seguente per connetterti al contenitore MySQL.
$ docker exec -it mysql bash
Collegati al database MySQL come root
utente eseguendo il comando seguente. Nel mio caso, ho impostato la mia password tramite MYSQL_ROOT_PASSWORD
.
$ mysql -u root -p
Se hai usato MYSQL_RANDOM_ROOT_PASSWORD=1
all'avvio del container, puoi ottenere la password generata automaticamente dai log.
$ docker logs
$ docker logs mysql
La password di root generata automaticamente sarà lunga e non è qualcosa da ricordare. Puoi reimpostare la password di root eseguendo la query seguente.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysqlpassword';
Sostituisci la password 'mysqlpassword' con la tua password. Puoi anche creare il tuo utente e concedergli i privilegi come richiesto.
6. Carica dati campione
L'obiettivo principale della configurazione di mysql è caricare alcuni dati ed eseguire query su di essi. Ci sono alcuni modi per caricare i dati. Ho un file di esempio chiamato "load_data.sql
" con le seguenti query.
CREATE DATABASE IF NOT EXISTS football; USE football; CREATE TABLE IF NOT EXISTS players ( player_name VARCHAR(16) NOT NULL, player_age INT NOT NULL, player_club VARCHAR(16) NOT NULL, player_country VARCHAR(16) NOT NULL ); INSERT INTO players VALUES ("Messi",34,"PSG","Argentina"); INSERT INTO players VALUES ("Ronaldo",36,"MANU","Portugal"); INSERT INTO players VALUES ("Neymar",29,"PSG","Brazil"); INSERT INTO players VALUES ("Kane",28,"SPURS","England"); INSERT INTO players VALUES ("E Hazard",30,"MADRID","Belgium");
Il primo approccio sarà copiare i dati dalla macchina locale al contenitore docker usando "docker cp
" comando.
$ docker cp load_data.sql mysql:/tmp
$ docker exec -it mysql bash
$ ls -l /tmp/
Ora puoi connetterti al client mysql ed eseguire il comando sorgente o reindirizzare il file al client mysql.
$ mysql -u root -p
mysql> source /tmp/load_data.sql
Oppure
$ mysql -u root -p < /tmp/load_data.sql
Collegati al database e interroga la tua tabella.
$ mysql -u root -p
mysql> show databases;
mysql> use football;
mysql> show tables;
mysql> select * from players;
Il secondo approccio sarebbe reindirizzare il .sql
file durante l'esecuzione di docker exec
comando.
$ docker exec -i mysql mysql -u root -p < load_data.sql
7. Imposta il contenitore MySQL utilizzando Docker-Compose
Invece di estrarre l'immagine ed eseguire docker run
comando, puoi utilizzare docker-compose per far girare velocemente il contenitore. Docker-compose è più adatto quando devi creare più di un contenitore.
Crea un file chiamato docker-compose.yml
o docker-compose.yaml
file. Copia e incolla il seguente codice yaml. Questo è lo stesso che ho eseguito manualmente nelle sezioni precedenti.
version: '3.8' services: database: image: mysql:latest container_name: mysql environment: MYSQL_ROOT_PASSWORD: temp1234 ports: - "3306:3306" volumes: - mysql_volume:/var/lib/mysql volumes: mysql_compose_volume:
Ora esegui il comando seguente che attiverà il contenitore Docker MySQL.
$ docker-compose up
Esegui il comando seguente per controllare lo stato del contenitore avviato utilizzando docker-compose:
$ docker-compose ps
Risultato di esempio:
Name Command State Ports ------------------------------------------------------------------------------------------------- mysql docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
8. Connettiti al database MySQL utilizzando MySQL Workbench
Finora abbiamo visto come connettersi al database usando il client mysql dall'interno del container. Puoi anche connetterti al database utilizzando qualsiasi client GUI come mysql workbench, dbeaver, Heidi SQL, ecc.
La cosa importante da notare, indipendentemente dal client GUI che stai utilizzando, è quale porta è stata mappata quando avvii il container.
Nel mio caso ho mappato localhost (3306
) -> contenitore (3306
). Quindi, se devo stabilire una connessione al database, devo connettermi a localhost:3306
o 127.0.01:3306
.
Sto usando MySQL Workbench come client della GUI. Se non hai installato MySQL workbench nella tua macchina, puoi utilizzare le istruzioni seguenti per installarlo.
8.1. Installa MySQL Workbench in Linux
Vai al sito ufficiale per scaricare il file del pacchetto. Devi scegliere il tuo sistema operativo per scaricare il .deb
o .rpm
file.
Nel passaggio successivo, ti verrà chiesto di accedere o registrarti. Puoi saltare l'accesso o la registrazione facendo clic sull'opzione "No grazie, avvia il download".
Sui sistemi basati su Debian, installa MySQL Workbench come di seguito:
$ cd <path to downloaded .deb file>
$ sudo apt install ./mysql-workbench-community_8.0.27-1ubuntu21.04_amd64.deb
Sui sistemi basati su RHEL, installa MySQL Workbench come di seguito:
$ cd <path to downloaded .rpm file>
$ sudo dnf localinstall ./mysql-workbench-community-8.0.27-1.el8.x86_64.rpm
Una volta completata l'installazione, puoi avviare mysql workbench dal menu o dal trattino.
Avvia MySQL Workbench
8.2. Collegati al database MySQL
Connettiti al database in esecuzione all'interno di un contenitore Docker. Dovresti provare a connetterti a localhost:3306
o localhost:<port-no>
a seconda di come è impostato il tuo container.
Prima di connetterti al database puoi premere "Test Connection " per verificare che MySQL workbench sia stato in grado di connettersi correttamente all'istanza del database.
Ora puoi iniziare a eseguire le tue query sulle tabelle che hai creato.
9. Conclusione
In questo articolo, abbiamo visto brevemente come avviare i container MySQL nella finestra mobile usando docker run
e docker-compose
metodi. Se vuoi configurare MySQL per scopi di test o apprendimento, Docker è più che sufficiente.
Spero che questo aiuti.