Docker è un ambiente di runtime di container che consente ai programmi di operare in un ambiente incarcerato senza dipendenze esterne richieste. I contenitori sono simili in alcuni concetti alle macchine virtuali, tuttavia non utilizzano un hypervisor e vengono eseguiti in una singola istanza del kernel, condividendo spesso l'istanza con altri contenitori. Una delle caratteristiche principali della containerizzazione è la mancanza di dipendenze esterne; il contenitore ha tutte le librerie e i componenti di runtime necessari per eseguire l'applicazione.
Oracle fornisce immagini di container Docker da MySQL 5.5.40 e quindi rende Docker una scelta eccellente per eseguire test su più versioni e rilasci di MySQL. Spesso è desiderabile eseguire test di regressione di un bug per determinare su quali versioni il bug ha effetto o per quantificare in che modo il comportamento è cambiato tra le versioni.
Docker consente l'avvio abbastanza leggero delle istanze MySQL con una funzione di pulizia automatica una volta completato il test. In questo post, illustrerò alcuni dei modi in cui puoi utilizzare Docker per avviare MySQL e utilizzarlo per i test.
Prima di poter utilizzare Docker, è necessario installarlo sul computer di prova. Se non hai accesso diretto a un sistema Linux, ti consiglio di ottenere VirtualBox e creare una macchina virtuale Linux per l'esecuzione di immagini Docker, alcune buone scelte per il sistema operativo sarebbero CentOS 7 o Fedora (l'ultimo). Fedora può essere considerata la variante a monte delle varianti Linux aziendali e quindi sarà garantito il supporto più recente per le tecnologie.
Installazione
1. Sui sistemi che hanno YUM o DNF e hanno accesso ai repository del sistema operativo, puoi installare la finestra mobile con questo comando:
# yum install docker docker-common
Dopo aver eseguito quel comando, YUM dovrebbe chiederti di installare la finestra mobile e tutte le dipendenze necessarie.
2. Per utilizzare Docker, devi quindi avviare il servizio:
# service docker start
Nelle distribuzioni CentOS/RHEL 7, usa systemctl:
# systemct start docker
3. Se vuoi che Docker sia disponibile dopo ogni riavvio, abilitalo con questo comando:
# chkconfig docker on
Nelle distribuzioni CentOS/RHEL 7, usa systemctl:
# systemct enable docker
Come funziona Docker
Docker di per sé è solo un gestore di container, per utilizzare efficacemente Docker è necessario avere accesso a docker.io, il sito da cui vengono pubblicate e scaricate le immagini dei container Docker. I container Docker in docker.io contengono un'immagine dei binari MySQL e delle informazioni sulle dipendenze in modo che il servizio Docker possa scaricare i file di runtime appropriati e il filesystem virtuale in cui eseguire il container Docker.
Quando crei un'istanza del contenitore Docker, esso alloca un filesystem virtuale per il contenitore che è persistente tra le esecuzioni (a meno che tu non utilizzi il –rm interruttore). Puoi avviare e arrestare i contenitori Docker a piacimento e rimarranno persistenti durante i riavvii. Una delle funzionalità di Docker che lo rende particolarmente utile per le istanze di test è la possibilità di cancellare il contenitore una volta interrotto. Se avvii un container Docker con l'opzione –rm, quando il container viene arrestato viene eliminato anche dal filesystem e aiuta a eliminare il cruft.
Creazione e avvio di container
Ecco il comando più semplice per avviare l'ultima versione di MySQL in un container e rimuoverla dopo lo spegnimento:
# docker run --rm --name=mysql8 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql/mysql-server:latest
Ecco la decodifica di quel comando:
- porta mobile – docker è il nome eseguibile utilizzato per eseguire tutte le funzioni della finestra mobile.
- corri – questo è un comando dato alla finestra mobile, indica alla finestra mobile di creare un nuovo contenitore ed eseguirlo.
- –rm – questo indica a Docker di rimuovere i file contenitore dopo che è stato interrotto.
- –nome=mysql8 – questo dice a Docker di nominare il contenitore "mysql8" per tutti i futuri riferimenti ai comandi. Questo nome è arbitrario ma dovrebbe essere descrittivo per evitare conflitti con più istanze del contenitore.
- -e MYSQL_ALLOW_EMPTY_PASSWORD – questo passa un'opzione al contenitore durante la fase di creazione, dicendo al contenitore di assegnare una password di root vuota durante il processo di creazione.
- -d mysql/mysql-server:latest – questo indica a docker il repository e la versione da scaricare da docker.io durante la creazione del contenitore. La parola "più recente" è una versione magica che dice a Docker di scaricare la versione più recente di tutte le versioni di MySQL, puoi anche specificare i numeri di versione esatti.
Alcune delle utili modifiche del comando precedente potrebbero essere specificare una versione di MySQL o assegnarle un nome univoco. Ecco un esempio in cui viene specificato MySQL 8.0.13 e viene utilizzato un nome univoco simile:
# docker run --rm --name=mysql8013 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql/mysql-server:8.0.13
Puoi anche richiamare istanze MySQL 5.5 in questo modo:
docker run --rm --name=mysql55 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql/mysql-server:5.5Nota :Gli esempi di cui sopra ignorano DELIBERATAMENTE qualsiasi sicurezza per motivi di convenienza e convenienza. NON utilizzare o replicare queste configurazioni in un ambiente di produzione, NON sono sicure!
Utilizzo dell'istanza Docker
Finora abbiamo solo discusso dell'avvio dell'istanza Docker, ma senza l'accesso al programma client non è molto utile. Creare connessioni utilizzando i programmi client MySQL standard è abbastanza semplice perché utilizzano connessioni socket locali e si connettono tramite localhost. Se vuoi connetterti usando un IP di rete, come con MySQL Workbench, è un po' più complicato.
Ecco un esempio di una connessione CLI mysql locale:
# docker exec -it mysql8 mysql -uroot
Analizziamo quel comando:
- esecutivo – dice a docker di eseguire un comando all'interno di un'istanza del contenitore docker.
- -it – dice a Docker di creare una sessione interattiva con uno pseudo-tty.
- mysql8 – dice a docker che il comando verrà eseguito nell'istanza del contenitore denominata 'mysql8'.
- mysql -uroot – questa è l'effettiva riga di comando della shell grezza che la finestra mobile esegue all'interno dell'istanza del contenitore.
I contenitori MySQL Docker includono le utilità della riga di comando MySQL, come mysql, mysqlpump, mysqldump, ecc. Se si desidera reindirizzare i dati in uno degli strumenti della riga di comando, come il caricamento di un dump, sarà necessario rimuovere - t dalla riga di comando, in questo modo:
# docker exec -i mysql8 mysql -uroot < dumpfile.sql
Accesso TCP/IP ai container Docker
Utilizzando i comandi di esempio sopra, Docker assegnerà indirizzi IP privati non instradabili ai container e creerà un'interfaccia di rete virtuale sul tuo sistema. L'interfaccia virtuale e il contenitore costituiscono gli endpoint per effettuare connessioni TCP/IP al servizio in esecuzione nel contenitore.
Per scoprire l'indirizzo IP della tua interfaccia di rete virtuale sulla tua macchina Linux, esegui questo comando:
shell> ip addr show docker0 8: docker0:mtu 1500 qdisc noqueue state UP group default link/ether 02:42:f7:98:c4:d1 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:f7ff:fe98:c4d1/64 scope link valid_lft forever preferred_lft forever
Nell'esempio sopra puoi vedere che l'indirizzo IP assegnato alla mia interfaccia Docker virtuale è 172.17.0.1, questo è l'endpoint da cui si connetterà l'applicazione client; questo è l'indirizzo IP che utilizzerai per creare un utente in MySQL.
Per determinare l'indirizzo IP assegnato alla tua istanza del contenitore, esegui questo comando, sostituendo il nome della tua istanza con 'mysql' nell'esempio:
shell> docker inspect mysql8 | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2",
Nell'output precedente l'indirizzo IP dell'istanza del contenitore è 172.17.0.2, quindi gli endpoint 172.17.0.1 <-> 172.17.0.2. Quindi dobbiamo creare un utente per la connessione del programma client, altrimenti riceverai una negazione perché 172.17.0.1 non è un host consentito.
shell> docker exec -it mysql8 mysql -uroot mysql> create user [email protected] identified by ''; Query OK, 0 rows affected (0.01 sec) mysql> grant all on *.* to [email protected] with grant option; Query OK, 0 rows affected (0.01 sec)
Dopo aver creato l'utente di rete, puoi connetterti all'istanza del contenitore come root senza password. La rete 172.17.0.0/16 è una rete privata non instradabile a cui non è possibile accedere dall'esterno della tua macchina, quindi non c'è pericolo che qualcuno acceda al tuo container Docker dall'esterno.
Spegnimento e pulizia
Dopo aver completato il test, dovrai spegnere l'istanza Docker e pulire i file se non hai utilizzato --rm all'avvio.
Per arrestare un'istanza Docker:
# docker stop mysql8
Per rimuovere l'istanza:
# docker rm mysql8
Conclusione
Spero di aver illustrato l'utilità dei contenitori Docker per i test e l'utilizzo della sandbox. Docker ha il potenziale per modificare il flusso di lavoro e rendere i test di regressione veloci, facili e convenienti. L'hub Docker contiene immagini per la versione 5.5.40 e successive.