Introduzione a Docker

Riferimenti alla documentazione di Docker
Sezione intitolata âRiferimenti alla documentazione di DockerâI riferimenti alla documentazione di Docker sono:
- Il sito ufficiale della documentazione Docker
- Le pagine della documentazione relative alla CLI di Docker
Guida allâInstallazione di Docker Desktop con WSL 2 su Windows
Sezione intitolata âGuida allâInstallazione di Docker Desktop con WSL 2 su WindowsâIl Ruolo di Hyper-V: Serve Ancora?
Sezione intitolata âIl Ruolo di Hyper-V: Serve Ancora?âIn passato, Docker Desktop per Windows si basava esclusivamente su Hyper-V, la tecnologia di virtualizzazione di Microsoft. Con lâintroduzione di WSL 2, lo scenario è cambiato. WSL 2 utilizza una versione ottimizzata di Hyper-V sotto il cofano, nota come Piattaforma macchina virtuale (Virtual Machine Platform). Quando si installa Docker Desktop con il backend WSL 2 (lâopzione predefinita e consigliata), non è piĂš necessario abilitare manualmente lâintera funzionalitĂ di Hyper-V. Ă sufficiente che la Piattaforma macchina virtuale sia attiva.
Verifica dei Prerequisiti di Virtualizzazione
Sezione intitolata âVerifica dei Prerequisiti di VirtualizzazioneâPrima di iniziare, è fondamentale assicurarsi che la virtualizzazione hardware sia abilitata nel BIOS/UEFI del computer. Per verificarlo rapidamente da Windows:
-
Aprire il Task Manager (Gestione attivitĂ ) premendo
Ctrl + Maiusc + Esc. -
Andare alla scheda Prestazioni.
-
Selezionare la CPU.
-
Controllare la voce Virtualizzazione: deve essere Abilitato.
Se la virtualizzazione non fosse abilitata, è necessario riavviare il computer ed entrare nel BIOS/UEFI (solitamente premendo tasti come F2, F10, o Canc allâavvio) per attivarla. Le opzioni si trovano spesso sotto le sezioni relative a âCPU Configurationâ o âAdvancedâ e possono avere nomi come âIntel VT-xâ o âAMD-Vâ.
Installazione di WSL 2 e Ubuntu 24.04 LTS
Sezione intitolata âInstallazione di WSL 2 e Ubuntu 24.04 LTSâWSL 2 permette di eseguire un kernel Linux reale direttamente su Windows. Questo garantisce prestazioni elevate e piena compatibilitĂ con strumenti come Docker.
Passo 1: Installazione di WSL
Sezione intitolata âPasso 1: Installazione di WSLâPer installare WSL e la sua distribuzione Linux predefinita (che è solitamente lâultima versione LTS di Ubuntu), basta aprire un terminale come PowerShell o il Prompt dei comandi con privilegi di amministratore e digitare un singolo comando:
wsl --installQuesto comando si occupa di:
-
Abilitare le funzionalitĂ necessarie di Windows, inclusa la Piattaforma macchina virtuale.
-
Scaricare e installare lâultima versione del kernel Linux.
-
Impostare WSL 2 come versione predefinita.
-
Scaricare e installare la distribuzione Ubuntu LTS.
Al termine dellâinstallazione, sarĂ necessario riavviare il computer.
Passo 2: Configurazione Iniziale di Ubuntu
Sezione intitolata âPasso 2: Configurazione Iniziale di UbuntuâDopo il riavvio, lâinstallazione di Ubuntu si avvierĂ automaticamente. VerrĂ richiesto di creare un nome utente e una password. Queste credenziali sono specifiche per lâambiente Linux e non sono collegate allâaccount di Windows.
Se si desidera installare specificamente Ubuntu 24.04 LTS, è possibile cercarla nel Microsoft Store e installarla da lÏ, oppure usare il seguente comando da PowerShell (come amministratore) dopo aver eseguito wsl --install:
wsl --install -d Ubuntu-24.04Per verificare le distribuzioni installate e la versione di WSL in uso, si può usare il comando:
wsl -l -vLâoutput dovrebbe mostrare la distribuzione Ubuntu con la VERSION impostata a 2.
Installazione di Docker Desktop e Integrazione con WSL 2
Sezione intitolata âInstallazione di Docker Desktop e Integrazione con WSL 2âOra che WSL 2 è pronto, si può procedere con lâinstallazione di Docker Desktop.
Passo 1: Download e Installazione
Sezione intitolata âPasso 1: Download e Installazioneâ-
Andare alla pagina di download ufficiale di Docker Desktop: Docker Desktop.
-
Scaricare il file di installazione per Windows.
-
Eseguire lâinstaller. Durante la configurazione, assicurarsi che lâopzione âUse WSL 2 instead of Hyper-Vâ sia selezionata. Questa è lâimpostazione predefinita e raccomandata.
-
Seguire le istruzioni a schermo e riavviare il computer quando richiesto.
Passo 2: Abilitazione dellâIntegrazione WSL
Sezione intitolata âPasso 2: Abilitazione dellâIntegrazione WSLâDopo lâinstallazione, Docker Desktop si avvierĂ automaticamente. Lâicona della balena di Docker apparirĂ nellâarea di notifica. Per assicurarsi che Docker sia utilizzabile dalla distribuzione Ubuntu:
-
Fare clic con il tasto destro sullâicona di Docker e seleziona âSettingsâ (Impostazioni).
-
Andare su âResourcesâ > âWSL Integrationâ.
-
Assicurarsi che lâopzione âEnable integration with my default WSL distroâ sia attiva.
-
Nella lista sottostante, abilitare lâintegrazione per la distribuzione Ubuntu (es.
Ubuntu-24.04). -
Cliccare su âApply & Restartâ.
A questo punto, lâintegrazione è completa. I comandi docker e docker-compose saranno disponibili e funzionanti direttamente dal terminale di Ubuntu in WSL 2.
Per verificarlo, aprire il terminale di Ubuntu e digita:
docker --versionSi dovrebbe vedere la versione di Docker Engine installata, a conferma che tutto funziona correttamente.
Comandi di base di Docker
Sezione intitolata âComandi di base di Dockerâ## Primo esempio# https://docs.docker.com/reference/cli/docker/container/run/# Usage: docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]# Aliases: docker run
docker run hello-world
## Vedere i container attivi (running)# https://docs.docker.com/reference/cli/docker/container/ls/# Usage: docker container ls [OPTIONS]# Aliases: docker container list <-> docker container ps <-> docker psdocker ps
# vedere i container attivi (running) e non attivi (stopped)docker ps -a
## Terminare un container - docker stop# https://docs.docker.com/reference/cli/docker/container/stop/# Usage: docker container stop [OPTIONS] CONTAINER [CONTAINER...]# Aliases: docker stopdocker stop container_id# oppuredocker stop container_nameSi provi a lanciare un container con lâimmagine di Ubuntu:
docker run ubuntuSi provi a lanciare un container di Ubuntu in modo che venga eseguita unâazione per alcuni secondi:
docker run ubuntu sleep 20Il comando precedente lancia un container in foreground con la shell collegata. Per avviare un container in background, senza collegarlo alla shell corrente occorre utilizzare il parametro -d
Avviare un container in modalitĂ detached
Sezione intitolata âAvviare un container in modalitĂ detachedâ# https://docs.docker.com/reference/cli/docker/container/run/#detach# The --detach (or -d) flag starts a container as a background process that doesn't occupy# your terminal window. By design, containers started in detached mode exit when the root# process used to run the container exits, unless you also specify the --rm option.# If you use -d with --rm, the container is removed when it exits or when the daemon exits,# whichever happens first.
docker run -d ubuntu sleep 200# si verifichi che il container sia attivodocker psEseguire un nuovo comando in un container attivo (running)
Sezione intitolata âEseguire un nuovo comando in un container attivo (running)â# https://docs.docker.com/reference/cli/docker/container/exec/# Usage: docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]# Aliases: docker exec# Ad esempio, se un container di Ubuntu è running, si può eseguire su di esso un comando con la sintassi:docker exec container_id comando# oppuredocker exec container_name comando# ad esempio, supponendo che il container_name con l'immagine di Ubuntu sia stoic_mayer e che il comando sia cat /etc/hosts si può eseguire il comandodocker exec stoic_mayer cat /etc/hosts
# un esempio che mostra come far partire un container che rimane attivo dopo averlo lanciato# si lanci nginx (web server e reverse proxy) con l'opzione detachdocker run -d nginx# si verifichi che il container sia attivodocker ps# per terminare il container si può usare il comandodocker stop container_id# oppuredocker stop container_nameRimuovere un container
Sezione intitolata âRimuovere un containerâ# https://docs.docker.com/reference/cli/docker/container/rm/# Usage: docker container rm [OPTIONS] CONTAINER [CONTAINER...]# Alias: docker container remove <-> docker rm
# per rimuovere un container (sintassi abbreviata)docker rm container_id# oppuredocker rm container_name
# per rimuovere un container (sintassi estesa)docker container removeà anche possibile rimuovere piÚ container contemporaneamente mettendo piÚ identificativi/nomi separati da spazi. Per gli identificativi è anche possibile specificare solo le prime tre o quattro cifre esadecimali.
Eseguire un container con lâopzione di rimozione automatica allâuscita del processo --rm
Sezione intitolata âEseguire un container con lâopzione di rimozione automatica allâuscita del processo --rmâ# https://docs.docker.com/reference/cli/docker/container/run/#rm# By default, a container's file system persists even after the container exits. This makes debugging a lot easier,since you can inspect the container's final state and you retain all your data. If you'd like Docker to automatically clean up the container and remove the file system when the container exits, use the --rm flag
# Si esegua un task con un container Ubuntu che poi verrĂ automaticamente rimossodocker run -d --rm ubuntu sleep 20docker ps# passati i 20 secondi si verifichi che il container sia stato rimossodocker ps -aElenco delle immagini locali sul Docker host
Sezione intitolata âElenco delle immagini locali sul Docker hostâ# https://docs.docker.com/reference/cli/docker/image/ls/# Usage: docker image ls [OPTIONS] [REPOSITORY[:TAG]]# Aliases: docker image list <-> docker images
# Elenco delle immagini docker (sintassi abbreviata)docker images# Elenco delle immagini docker (sintassi estesa)docker image lsRimozione di immagini Docker
Sezione intitolata âRimozione di immagini Dockerâ# https://docs.docker.com/reference/cli/docker/image/rm/# Usage: docker image rm [OPTIONS] IMAGE [IMAGE...]# Aliases: docker image remove <-> docker rmi
# Rimozione di una immagine docker (sintassi abbreviata)docker rmi image_id# oppuredocker rmi image_name
# Rimozione di una immagine docker (sintassi estesa)docker image rm image_id# oppuredocker image rm image_nameEsempio di un container che ospita una web app
Sezione intitolata âEsempio di un container che ospita una web appâSi provi a lanciare un container a partire dallâimmagine kodekloud/simple-webapp. Il container in questione fa partire una web application che mostra una pagina di un colore random, oppure di un colore che viene impostato attraverso una variabile dâambiente.
Se si provasse a lanciare il container con il comando docker run kodekloud/simple-webapp la shell rimarrebbe collegata al container, ma anche cambiando shell e provando ad aprire il browser allâindirizzo indicato nella shell del container non si vedrebbe nulla. Lâoutput a console è:
# This is a sample web application that displays a colored background.# A color can be specified in two ways.
# 1. As a command line argument with --color as the argument. Accepts one of red,green,blue,blue2,pink,darkblue# 2. As an Environment variable APP_COLOR. Accepts one of red,green,blue,blue2,pink,darkblue# 3. If none of the above then a random color is picked from the above list.# Note: Command line argument precedes over environment variable.
# No command line argument or environment variable. Picking a Random Color =blue# * Serving Flask app "app" (lazy loading)# * Environment: production# WARNING: Do not use the development server in a production environment.# Use a production WSGI server instead.# * Debug mode: off# * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)Per terminare il container a cui si è collegati basta digitare CTRL+C
Se si provasse ad eseguire il comando docker run -d kodekloud/simple-webapp
non si vedrebbe comunque la pagina colorata perchĂŠ il container non è collegato allâinterfaccia di rete del computer (vedremo meglio i dettagli nella sezione networking).
Dopo aver fermato il container lanciato con il comando precedente con i comandi:
docker psdocker stop container_idIl modo corretto di eseguire lâavvio del container è:
docker run -d -p 8080:8080 kodekloud/simple-webapp# aprire il browser all'indirizzo localhost:8080# verificare che il container è in esecuzionedocker ps# aprire un altro container della stessa immagine su un'altra portadocker run -d -p 8081:8080 kodekloud/simple-webapp# aprire il browser all'indirizzo localhost:8081# verificare che entrambi i container sono in esecuzionedocker ps# è anche possibile passare un parametro corrispondente al coloredocker run -d -p 8082:8080 -e APP_COLOR=green kodekloud/simple-webapp# con l'esempio appena visto sono stati lanciati tre container della stessa immagine.La cosa piĂš importante di questo esempio è lâutilizzo del parametro -p che permette di effettuare il port mapping tra il container docker e il Docker Host (il computer).
Il parametro -p host_post:container_port permette di associare una porta sul computer host con la porta su cui è in ascolto il web server allâinterno del container.
Si fermino i container associati allâimmagine kodekloud/simple-webapp
docker psdocker stop container_id1 container_id2 container_id3# si rimuovano i containerdocker rm container_id1 container_id2 container_id3Un esempio di sito web statico servito allâinterno di un container Docker di Nginx
Sezione intitolata âUn esempio di sito web statico servito allâinterno di un container Docker di NginxâSi consideri il seguente esempio di sito statico (pagine web con solo HTML, CSS, JavaScript). Per lanciare un container Docker che serve il sito web è sufficiente:
-
Scaricare localmente il repository del progetto
Finestra del terminale git clone https://github.com/cloudacademy/static-website-example.git -
Lanciare il container Docker con il comando
Finestra del terminale docker run --name some-nginx -v 'C:\Users\path\to\static-website-example:/usr/share/nginx/html:ro' -d -p 8080:80 nginx -
Aprire il browser allâindirizzo
http://localhost:8080/ -
Terminare lâesecuzione del container con:
Finestra del terminale docker stop some-nginx -
Il container potrĂ essere fatto ripartire con
docker start some-nginxoppure rimosso condocker rm some-nginx
Alcuni dei comandi visti in questo esempio verranno ripresi e spiegati in dettaglio negli esempi successivi.
Lanciare un container in modalitĂ interattiva
Sezione intitolata âLanciare un container in modalitĂ interattivaâ# https://docs.docker.com/reference/cli/docker/container/run/#interactive# The --interactive (or -i) flag keeps the container's STDIN open, and lets you send input# to the container through standard input.# Ad esempioecho "ciao mondo" | docker run --rm -i ubuntu catLâopzione -i permette solo di avere accesso allo standard input del container, ma per poter interagire con esso occorre di solito abilitare anche lâopzione -t per abilitare anche lo pseudo-terminale.
Abilitare uno pseudo-terminale (pseudo-TTY) sul container
Sezione intitolata âAbilitare uno pseudo-terminale (pseudo-TTY) sul containerâ# https://docs.docker.com/reference/cli/docker/container/run/#tty# The --tty (or -t) flag attaches a pseudo-TTY to the container, connecting your terminal# to the I/O streams of the container. Allocating a pseudo-TTY to the container means that# you get access to input and output feature that TTY devices provide.# Ad esempio, lanciamo un container ubuntu con le opzioni -it (abbreviazione di -i -t)
docker run -it --rm ubuntu
# Ă anche possibile lanciare un container in modalitĂ detached con le opzioni -it
docker run -itd ubuntu
# In questo modo il container viene lanciato con le opzioni -i e -t abilitate, ma la shell corrente non è collegata ad esso. Sarà possibile collegarsi al container successivamente con un comando come docker attach, oppure sarà possibile eseguire un comando con docker exec
docker run -itd --rm ubuntu
# oppure
docker run -i -t -d --rm ubuntuSi noti che, nellâesempio precedente, con lâopzione -it il container non viene chiuso immediatamente poichĂŠ il comando predefinito è /bin/bash e il container ha lo STDIN aperto. In questo caso il container è in attesa che venga impartito un input sullo âSTDIN`. Per chiudere il container in questo caso esistono alcune opzioni mostrate negli esempi successivi.
Se si prova ad eseguire il comando seguente, si vedrĂ che il comando eseguito dal container è sleep 30 e non /bin/bash e allo scadere del tempo stabilito il container va nello stato stopped e quindi viene automaticamente rimosso grazie allâopzione --rm
docker run -itd --rm ubuntu sleep 30docker psUscita da un container
Sezione intitolata âUscita da un containerâSi supponga di far partire un container con lâopzione -it. Inoltre, per distinguere il container appena lanciato dagli altri eventualmente attivi, si utilizzi il parametro --name prima del nome dellâimmagine.
# https://phoenixnap.com/kb/exit-docker-container
docker run -it --name my_server ubuntuCon il comando precedente ci si ritrova, come utenti root, allâinterno di un container di Ubuntu.
# Alcuni comandi di prova all'interno del container:ls -alpwdwhoamicat /etc/*release*Per uscire dal container esistono due possibilitĂ :
- uscire in maniera definitiva, chiudendo anche il container (che verrĂ posto nello stato stopped)
- uscire senza chiudere il container
Uscita dal container e relativa chiusura dello stesso
Sezione intitolata âUscita dal container e relativa chiusura dello stessoâPer uscire in maniera definitiva da un container e porlo nello stato stopped basta inserire la sequenza CTRL+D.
Se il container sta eseguendo un processo, ad esempio sta eseguendo un ping, si deve prima inserire CTRL+C per inviare il segnale SIGINT, per fermare il processo e poi CTRL+D per uscire.
In alternativa, è anche possibile digitare exit per uscire dal container e porlo nello stato stopped.
docker run -it --name my_server2 ubuntuUscita dal container senza chiuderlo
Sezione intitolata âUscita dal container senza chiuderloâPer uscire da un container senza chiuderlo si utilizza la combinazione di tasti CTRL+P seguito da CTRL+Q. Dopo questa sequenza il container continua la sua esecuzione in background.
Attach a un container
Sezione intitolata âAttach a un containerâ# https://docs.docker.com/reference/cli/docker/container/attach/# Usage: docker container attach [OPTIONS] CONTAINER# Aliases: docker attachAlcuni esempi:
- Eseguire il comando
docker psper vedere i container attivi - Eseguire il comando
docker attach my_server2per connettersi al container. - Eseguire qualche comando nella shell del container e poi digitare
CTRL+Pseguito daCTRL+Qper uscire
Opzione --detach-keys
Sezione intitolata âOpzione --detach-keysâSia il comando docker run che il comando docker attach hanno anche unâopzione che consente di effettuare lâoverride della sequenza di tasti per effettuare il detach dal container. Ad esempio:
# https://docs.docker.com/reference/cli/docker/container/run/#detach-keysdocker run -it --detach-keys=ctrl-u,ctrl-u --name my_server5 ubuntudocker ps# https://docs.docker.com/reference/cli/docker/container/attach/#detach-keysdocker attach --detach-keys=ctrl-u,ctrl-u my_server5docker psRimozione di tutti i container nello stato stopped
Sezione intitolata âRimozione di tutti i container nello stato stoppedâ# https://docs.docker.com/reference/cli/docker/container/prune/
docker container prune# oppure, se si vuole il comando che non richiede conferma (utile negli script), si utilizza la versione con l'opzione -f# https://docs.docker.com/reference/cli/docker/container/prune/#filterdocker container prune -fDocker networking - primi elementi
Sezione intitolata âDocker networking - primi elementiâCome visto nelle slide del corso su Docker, se si utilizzano le impostazioni di default di Docker,i container vengono creati allâinterno di una network con driver di tipo bridge. In una network di tipo bridge, i container sono allâinterno di una rete isolata nella quale possono comunicare tra di loro mediante i loro indirizzi ip privati, ma non possono comunicare direttamente con gli host esterni alla sottorete nella quale si trovano.
In terms of Docker, a bridge network uses a software bridge which lets containers connected to the same bridge network communicate, while providing isolation from containers that arenât connected to that bridge network. The Docker bridge driver automatically installs rules in the host machine so that containers on different bridge networks canât communicate directly with each other.
When you start Docker, a default bridge network (also called bridge) is created automatically, and newly-started containers connect to it unless otherwise specified. You can also create user-defined custom bridge networks.
Important! â>User-defined bridge networks are superior to the default bridge network.
Differenze tra default bridge e user defined bridge
Sezione intitolata âDifferenze tra default bridge e user defined bridgeâPer capire le differenze tra il default bridge e le user defined bridge si veda la documentazione di Docker su questa pagina:
Quali sono le famiglie di indirizzi privati?
Sezione intitolata âQuali sono le famiglie di indirizzi privati?âUna semplice trattazione degli indirizzi privati è riportata su questo sito.
La comunicazione dei container con gli host esterni alla sottorete bridge avviene tramite NAT (Network Address Translation) effettuata dal Docker Host. Unâanalisi di questi aspetti è riportata qui
Riferimenti alla documentazione relativa al networking di Docker
Sezione intitolata âRiferimenti alla documentazione relativa al networking di DockerâDocker network driver di tipo bridge
Esercitazione
Sezione intitolata âEsercitazioneâSvolgimento della prima parte del tutorial
Docker networking - port mapping
Sezione intitolata âDocker networking - port mappingâCome riportato nella documentazione ufficiale di Docker relativa al networking: By default, when you create or run a container using docker create or docker run,
containers on bridge networks donât expose any ports to the outside world.
Use the --publish or -p flag to make a port available to services outside the bridge network. This creates a firewall rule in the host, mapping a container port to a port on the Docker host to the outside world. Here are some examples:
| Flag value | Description |
|---|---|
-p 8080:80 | Map port 8080 on the Docker host to TCP port 80 in the container. |
-p 192.168.1.100:8080:80 | Map port 8080 on the Docker host IP 192.168.1.100 to TCP port 80 in the container. |
-p 8080:80/udp | Map port 8080 on the Docker host to UDP port 80 in the container. |
-p 8080:80/tcp -p 8080:80/udp | Map TCP port 8080 on the Docker host to TCP port 80 in the container, and map UDP port 8080 on the Docker host to UDP port 80 in the container. |
If you include the localhost IP address (127.0.0.1, or ::1) with the publish flag, only the Docker host and its containers can access the published container port.
Ip address and hostname
Sezione intitolata âIp address and hostnameâBy default, the container gets an IP address for every Docker network it attaches to. A container receives an IP address out of the IP subnet of the network. The Docker daemon performs dynamic subnetting and IP address allocation for containers. Each network also has a default subnet mask and gateway.
DNS service
Sezione intitolata âDNS serviceâContainers use the same DNS servers as the host, but you can override this with âdns. By default, containers inherit the DNS settings as defined in the /etc/resolv.conf configuration file. Containers that attach to the default bridge network receive a copy of this file. Containers that attach to a custom network use Dockerâs embedded DNS server. The embedded DNS server forwards external DNS lookups to the DNS servers configured on the host. I dettagli sulle user defined bridge network verranno analizzati piĂš avanti
Esempi di container con port mapping
Sezione intitolata âEsempi di container con port mappingâSi lanci Nginx nella sua configurazione di default, in modo che mostri solo la pagina di benvenuto:
docker run --name my_web_server --rm -d -p 8080:80 nginxSe si apre il browser allâindirizzo localhost:8080 si vedrĂ la pagina di benvenuto di Nginx.
Si lanci un container a partire dallâimmagine kodekloud/simple-webapp:
docker run --name my_web_app --rm -d -p 8081:8080 kodekloud/simple-webappDocker storage - primi elementi
Sezione intitolata âDocker storage - primi elementiâCome descritto nella documentazione di Docker: By default all files created inside a container are stored on a writable container layer.
This means that:
- The data doesnât persist when that container no longer exists, and it can be difficult to get the data out of the container if another process needs it.
- A containerâs writable layer is tightly coupled to the host machine where the container is running. You canât easily move the data somewhere else.
Docker has two options for containers to store files on the host machine, so that the files are persisted even after the container stops:
- volumes
- bind mounts
Docker also supports containers storing files in-memory on the host machine. Such files are not persisted.
Opzioni di storage scegliere per i container Docker
Sezione intitolata âOpzioni di storage scegliere per i container DockerâVolumes are stored in a part of the host filesystem which is managed by Docker
(/var/lib/docker/volumes/ on Linux). Non-Docker processes should not modify this part
of the filesystem. Volumes are the best way to persist data in Docker
Bind mounts
Sezione intitolata âBind mountsâBind mounts may be stored anywhere on the host system. They may even be important system files or directories. Non-Docker processes on the Docker host or a Docker container can modify them at any time
tmpfs mounts are stored in the host systemâs memory only, and are never written to the host systemâs filesystem
Dove sono memorizzati i volumi di Docker?
Sezione intitolata âDove sono memorizzati i volumi di Docker?âIn linux sono nella cartella: /var/lib/docker/volumes/
In Windows sono nella cartella \\wsl.localhost\docker-desktop\mnt\docker-desktop-disk\data\docker\volumes
Lo stesso percorso si può scrivere anche come: \\wsl$\docker-desktop-data\data\docker\volumes
Bind mounts and volumes can both be mounted into containers using the -v or --volume flag,
but the syntax for each is slightly different. For tmpfs mounts, you can use the --tmpfs flag. We recommend using the --mount flag for both containers and services, for bind mounts, volumes,
or tmpfs mounts, as the syntax is more clear.
Bind mounts overview
Sezione intitolata âBind mounts overviewâBind mounts have limited functionality compared to volumes. When you use a bind mount, a file or directory on the host machine is mounted into a container. The file or directory is referenced by its full path on the host machine. The file or directory doesnât need to exist on the Docker host already. It is created on demand if it doesnât yet exist. Bind mounts are fast, but they rely on the host machineâs filesystem having a specific directory structure available. If you are developing new Docker applications, consider using named volumes instead. You canât use Docker CLI commands to directly manage bind mounts.
Si veda anche questo articolo per un approfondimento.
Esempi di container che utilizzano il bind mount
Sezione intitolata âEsempi di container che utilizzano il bind mountâPagina di documentazione dellâimmagine di Nginx
Esempio con bind mount e port mapping - setup di Nginx con un sito web
Sezione intitolata âEsempio con bind mount e port mapping - setup di Nginx con un sito webâSi supponga di avere le pagine web in una cartella nella wsl: ~/my-dev/static-sites/site-demo. Si può prendere come esempio il sito condiviso su Team.
Il primo esempio della documentazione di Nginx sulla pagina ufficiale di Docker Hub è:
docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginxLâesempio mostrato è un bind mount perchĂŠ viene associata la cartella /some/content
allâinterno del Docker Host (il computer utilizzato) alla cartella /usr/share/nginx/html
allâinterno del container di Nginx. Lâopzione :ro serve nel caso in cui si voglia montare
lo spazio di storage in sola lettura (read only).
Si modifichi lâesempio riportato su Docker Hub per adattarlo a questo esempio (da eseguire nella WSL):
docker run --name my_nginx -d --rm -v ~/my-dev/static-sites/site-demo:/usr/share/nginx/html:ro -p 8080:80 nginxSe docker venisse lanciato da PowerShell il bind mount andrebbe scritto usando la notazione PowerShell per il percorso che punta alla cartella del sito web. Supponendo di creare una cartella in Windows (e non in WSL questa volta) in
$env:USERPROFILE\source\repos\my-dev\static-files\site-demoIl seguente è un comando per PowerShell o CMD:
docker run --name my_nginx2 -d --rm -v "$env:USERPROFILE\source\repos\my-dev\static-files\site-demo:/usr/share/nginx/html:ro" -p 8082:80 nginxEsempio con bind mount e port mapping - setup del database MySQL con bind mount e port mapping
Sezione intitolata âEsempio con bind mount e port mapping - setup del database MySQL con bind mount e port mappingâLâimmagine ufficiale docker di MySQL si trova su Docker hub. La documentazione sul deployment di MySQL attraverso Docker si trova nelle guide âDocker installation in Linuxâ e âDocker MySQL getting startedâ.
Dalla pagina di Docker hub di MySQL:
What is MySQL?
MySQL is the worldâs most popular open source database. With its proven performance, reliability and ease-of-use, MySQL has become the leading database choice for web-based applications, covering the entire range from personal projects and websites, via e-commerce and information services, all the way to high profile web properties including Facebook, Twitter, YouTube, Yahoo! and many more.
Per far partire un container con MySQL si può lanciare un comando come il seguente:
docker run --name mysql-server1 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 3306:3306 mysql:latest# ad esempiodocker run --name mysql-server1 -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mysql:latest# oppuredocker run --name mysql-server1 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 3306:3306 mysql# oppure per far partire una specifica versionedocker run --name mysql-server1 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 3306:3306 mysql:9.0.1Per connettersi a MySQL si può procedere in diversi modi:
-
si lancia una shell bash direttamente sul container del server di MySQL: si apre unâaltra finestra del terminale su WSL (Ubuntu) e si digita il comando seguente:
Finestra del terminale docker exec -it mysql-server1 /bin/bashnella shell del container di mysql si posso eseguire i comandi:
Finestra del terminale pwdcat /etc/*release*# per effettuare la connessione al server di mysql, utilizzando il programma client di mysqlmysql -u root -p# il comando precedente può anche essere scritto comemysql -uroot -p# ossia mettendo il nome utente direttamente attaccato a -u# se si volesse inserire subito la password (ad esempio root) si potrebbe scriveremysql -uroot -proot# questo modo di accedere è considerato insicuro se si accede direttamente sulla# command line, ma può essere utilizzato quando si esegue uno scriptPer verificare che il database dia funzionante si esegue la seguente query SQL:
select user, host from mysql.user;-- Si esce dalla sessione interattiva con `mysql`, digitando il comando:exitPer uscire dal container si può digitare
exit -
Si effettua la connessione da un applicativo client del Docker Host (il PC utilizzato)
-
Si utilizza VS Code con il plugin per MySQL chiamato MySQL con ID =
cweijan.vscode-mysql-client2e si effettua la connessione specificando i seguenti parametri:host --> 127.0.0.1 oppure localhostport --> 3306 (è la porta utilizzata per il docker host e che è stata mappata sulla 3306 del container)username --> rootpassword --> quella usata all'atto della creazione del container -
Si effettua la connessione utilizzando
mysql clientdella distribuzione Linux della WSL. Ad esempio, per Ubuntu 24.04 è possibile installaremysql-client-corecon il comandosudo apt install mysql-client-core-8.0.Finestra del terminale sudo apt install mysql-client-core-8.0Dopo aver installato il pacchetto suddetto, la connessione può avvenire direttamente dalla shell della distribuzione Linux della WSL con il comando:
Finestra del terminale mysql -uroot -h 127.0.0.1 -pIn questo caso occorre inserire lâindirizzo IP del server e non il nome DNS (localhost) altrimenti la connessione non avrĂ successo.
-
Si utilizza lâapplicativo
MySQL Workbenchinstallato sul computer (se disponibile) e si fa la connessione con i parametri richiesti (username e password), specificando come host lâindirizzo127.0.0.1. MySQL Workbench può essere scaricato da questa pagina. Si potrebbe utilizzare anche il programmamysql.exeper Windows che viene distribuito nella versione di MySQL per Windows, ma in tal caso, occorrerebbe utilizzare una versione del client che supporta il plugin per la sicurezzacaching_sha2_password, oppure bisogna procedere come descritto in questa pagina -
Si effettua la connessione da un altro container docker. In questo caso si può scegliere tra diverse opzioni:
-
Usare la stessa immagine di
mysqlper connettersi al server, come indicato nella documentazione di MySQL su Docker Hub
Finestra del terminale docker run -it --network some-network --rm mysql mysql -hsome-mysql -uexample-user -pNellâistruzione precedente, lâultima parte del comando docker è mysql
-hsome-mysql -uexample-user -ped è usata per lanciare il client di mysql verso un altro container dove è in esecuzione il server di mysql (mysqld). Lâesempio precedente assume che sia stata creata una user-defined network per i container in modo che sia abilitata la risoluzione DNS dei nomi dei container e che il nome del container del server di MySQL abbia il nomesome-mysql. In alternativa, si può:- Utilizzare lâindirizzo privato del server al posto del nome host (
some-host). Questo indirizzo privato può essere recuperato eseguendo il comandodocker container inspectsul container su cui è in esecuzione il server di MySQL.
Finestra del terminale docker inspect mysql-server1Lâestrazione dellâindirizzo ip può essere ottenuta con la sintassi del linguaggio
Go(con cui è scritto Docker)Finestra del terminale docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-server1container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-server1)docker run -it --name my-client --rm mysql:latest mysql -h"$container_ip" -uroot -pdove:
-f '{{...}}':- lâopzione
-fspecifica un formato personalizzato per lâoutput di docker inspect. La stringa tra apici singoli è una template string che indica come estrarre i dati dalJSONrestituito dadocker inspect.
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}':- Questa espressione è una
Go template syntaxutilizzata per navigare nelJSONe ottenere valori specifici.
{{range ...}}:- Inizia un ciclo per iterare su un array o una mappa. Qui si sta iterando su
.NetworkSettings.Networks, che contiene formazioni sulle reti del container.
{{.IPAddress}}:- Allâinterno del ciclo,
.rappresenta lâelemento corrente (una rete), e.IPAddressestrae lâindirizzo IP di quella rete.
{{end}}:- Termina il ciclo range. Se ci sono piĂš reti, il ciclo itera su ciascuna di esse
In alternativa, mediante il comando
jq- commandline JSON processor- Installazione di jq, se non giĂ presente sulla propria distribuzione
- Estrazione dellâindirizzo ip del server con il comando
jq -r '.[0].NetworkSettings.Networks[].IPAddress'
Finestra del terminale sudo apt-get install jqcontainer_ip=$(docker inspect mysql-server1 | jq -r '.[0].NetworkSettings.Networks[].IPAddress')docker run -it --name my-client --rm mysql:latest mysql -h"$container_ip" -uroot -p -
-
Lanciare il container con la bash ed eseguire altri comandi prima di lanciare il client
mysql:Finestra del terminale docker run -it --name my-client --rm -v ~/my-dev/sql-stuff:/sql-stuff mysql:latest /bin/bash -
Lanciare il container docker per il client di MySQL con lâopzione
--link(legacy e possibilmente da evitare), come descritto nella pagina della documentazione docker: -
usare un container con lâimmagine di MySQL Workbench.
Scaricare a casa lâimmagine di My workbench con il comando
Finestra del terminale docker pull lscr.io/linuxserver/mysql-workbench:latestSi può far partire il container con lâistruzione seguente:
Finestra del terminale docker run -d \--name=mysql-workbench \-e PUID=1000 \-e PGID=1000 \-e TZ=Etc/UTC \-p 3000:3000 \-p 3001:3001 \-v ~/my-dev/mysql-workbench-config:/config \--cap-add="IPC_LOCK" \--restart unless-stopped \lscr.io/linuxserver/mysql-workbench:latestNellâistruzione precedente si è creata la cartella
~/my-dev/config` nella distribuzione Linux della WSL per consentire il salvataggio delle impostazioni dellâapplicazione MySQL Workbench.Per utilizzare lâapplicazione si apre il browser allâindirizzo
http://localhost:3000per connessionihttp, oppure allâindirizzohttps://localhost:3001per connessionihttps(in questo caso occorre accettare il certificato privato del server)Per effettuare le connessioni al server di MySQL con questo container occorre fare le stesse considerazioni fatte per le altre modalitĂ di accesso tra container docker. In questo caso la connessione può essere stabilita utilizzando lâ
indirizzo privatodel container docker di MySQL server, oppure creando unauser-define custom networke usare il nome del container come nome host a cui connettersi.Per ottenere lâindirizzo privato del container a cui ci si vuole connettere si può utilizzare il comando:
Finestra del terminale docker container inspect container_id# oppuredocker container inspect container_name -
usare un container con lâimmagine di
phpMyAdmin.Scaricare a casa lâimmagine di
phpMyAdmincon il comando:Finestra del terminale docker pull phpmyadmin# https://hub.docker.com/_/phpmyadmindocker run --name phpmyadmin -d --link mysql-server1:db -p 8080:80 phpmyadmin
-
Volumes overview
Sezione intitolata âVolumes overviewâVolumes are created and managed by Docker. You can create a volume explicitly using the docker volume create command, or Docker can create a volume during container or service creation.
When you create a volume, itâs stored within a directory on the Docker host. When you mount the volume into a container, this directory is whatâs mounted into the container. This is similar to the way that bind mounts work, except that volumes are managed by Docker and are isolated from the core functionality of the host machine.
A given volume can be mounted into multiple containers simultaneously. When no running container is using a volume, the volume is still available to Docker and isnât removed automatically.
You can remove unused volumes using docker volume prune.
When you mount a volume, it may be named or anonymous. Anonymous volumes are given a random name
thatâs guaranteed to be unique within a given Docker host. Just like named volumes, anonymous volumes
persist even if you remove the container that uses them, except if you use the --rm flag when creating
the container, in which case the anonymous volume is destroyed.
If you create multiple containers after each other that use anonymous volumes, each container creates its own volume. Anonymous volumes arenât reused or shared between containers automatically. To share an anonymous volume between two or more containers, you must mount the anonymous volume using the random volume ID.
Creazione di un volume
Sezione intitolata âCreazione di un volumeâSeguendo la guida di Docker relativa alla gestione dei volumi, si scopre che la creazione e la gestione di un volume è molto semplice:
# creazione del volume di nome mysql-server1-voldocker volume create mysql-server1-vol
# elenco dei volumi sul docker hostdocker volume ls
# ispezione delle caratteristiche di un volumedocker volume inspect mysql-server1-volEliminazione di un volume
Sezione intitolata âEliminazione di un volumeâ# https://docs.docker.com/reference/cli/docker/volume/rm/# Usage: docker volume rm [OPTIONS] VOLUME [VOLUME...]# Aliases: docker volume remove# Nel caso di volumi indicati tramite id, occorre specificare tutto l'identificativo e non solo le prime cifredocker volume remove volume_idAvvio di un container con un volume collegato
Sezione intitolata âAvvio di un container con un volume collegatoâDalla guida di Docker sui volumi: âIf you start a container with a volume that doesnât yet exist, Docker creates the volume for you. The following example mounts the volume myvol2 into /app/ in the container.â
docker run -d \ --name devtest \ -v myvol2:/app \ nginx:latestCreazione automatica di volumi in container Docker
Sezione intitolata âCreazione automatica di volumi in container DockerâCosa succederebbe se si lanciasse un container con la notazione -v /dbdata? In questo caso non essendo specificato il volume da associare alla cartella /dbdata allâinterno del container, verrebbe creato un volume anonimo associato alla cartella /dbdata
docker run -v /dbdata --name dbstore ubuntu /bin/bashProvare a lanciare il container dbstore e poi eseguire i comandi seguenti (uno alla volta)
docker psdocker container inspect dbstoredocker volume lsdocker rm -v dbstoreĂ possibile lanciare un container con un volume che non esiste ancora. In tal caso il volume verrĂ creato nel momento in cui viene lanciato il container. Ad esempio, lanciando i comandi:
docker run -itd -v dbstore_volume:/dbdata --name dbstore ubuntu /bin/bashdocker attach dbstoreProvare successivamente a:
- creare alcuni file nella cartella dbdata
- uscire dal container
- eventualmente si può provare a fermare (stop) e poi far ripartire (start) lo stesso container
dbstore
Docker Networking - User defined networks (importante!)
Sezione intitolata âDocker Networking - User defined networks (importante!)âNella guida di Docker relativa al networking si legge: âYou can create custom, user-defined networks, and connect multiple containers to the same network. Once connected to a user-defined network, containers can communicate with each other using container IP addresses or container namesâ.
Si crei la rete my-net con lâistruzione seguente:
docker network create -d bridge my-net
# si verifichi che la rete sia stata creata con il comandodocker network ls
# si analizzino le proprietĂ della rete creata con il comando:docker network inspect my-net
# si fermi e si rimuovano i container precedentemente creati per MySQL e per le relative applicazioni client.docker ps
# id1, id2, id3, etc. siano rispettivamente gli id dei container precedentemente creatidocker stop id1 id2 id3
# si rimuovano tutti i container non in esecuzionedocker container prune -f
# si verifichi che il volume anonimo creato per MySQL sia ancora presente:docker volume lsCreazione di container Docker con volumi, collegati alla stessa sottorete (importante)
Sezione intitolata âCreazione di container Docker con volumi, collegati alla stessa sottorete (importante)âCreazione del container di MySQL con volumi e sottorete
Sezione intitolata âCreazione del container di MySQL con volumi e sottoreteâSi ricrei nuovamente nuovamente un container per MySQL server, questa volta usando la sottorete my-net e utilizzando i volumi con nome:
# https://docs.docker.com/engine/storage/volumes/#create-and-manage-volumesdocker volume create mysql-server1-voldocker volume lsdocker volume inspect mysql-server1-vol
# si crei il container per MySQL:docker run -d \ --name mysql-server1 \ --network my-net \ --restart unless-stopped \ -v mysql-server1-vol:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -p 3306:3306 mysql:latestSi analizzino le caratteristiche del container creato, in particolare i volumi, la rete, lâindirizzo ip e i nomi dns che sono stati utilizzati per il container:
docker container inspect mysql-server1Si verifichi che anche la rete my-net sia stata aggiornata
docker network inspect my-netCreazione del container di phpMyAdmin con sottorete
Sezione intitolata âCreazione del container di phpMyAdmin con sottoreteâSi lanci un container docker di phpMyAdmin che si connette al database:
docker run -d \ --name phpmyadmin \ --network my-net \ -e PMA_HOST=mysql-server1 \ -p 8080:80 phpmyadminCreazione del container di MySQL Workbench con volumi e sottorete
Sezione intitolata âCreazione del container di MySQL Workbench con volumi e sottoreteâSi lanci un container docker di MySQL Workbench nella network my-net:
docker run -d \ --name=mysql-workbench \ --network my-net \ -e PUID=1000 \ -e PGID=1000 \ -e TZ=Etc/UTC \ -p 3000:3000 \ -p 3001:3001 \ -v ~/my-dev/mysql-workbench-config:/config \ -v ~/my-dev/sql-stuff:/sql-stuff \ --cap-add="IPC_LOCK" \ --restart unless-stopped \ lscr.io/linuxserver/mysql-workbenchCon la sottorete my-net è possibile usare i nomi dei container come nomi host al posto degli indirizzi ip. Dopo aver aperto MySQL Workbench, nel pannello di configurazione della connessione al server di MySQL mysql-server1 è possibile specificare come host proprio il nome del container mysql-server1. Questo è dovuto al fatto che nelle user-defined custom network docker abilita il servizio DNS che risolve i nomi dei container con i rispettivi indirizzi ip allâinterno della sottorete.Questa funzionalitĂ non è disponibile se si utilizza la sottorete di default di docker.
Connessione al database server di MySQL tramite container come applicativo client
Sezione intitolata âConnessione al database server di MySQL tramite container come applicativo clientâIn questo caso si crei un container a partire dallâimmagine di mysql con il solo scopo di utilizzare lâapplicativo client mysql presente nel container:
docker run -it \ --name my-client \ --network my-net \ --rm \ -v ~/my-dev/sql-stuff:/sql-stuff \ mysql:latest /bin/bashDopo aver creato il container si può far partire lâapplicativo client utilizzando come nome host
del server direttamente il nome del container mysql-server1. In questo caso si utilizza il
meccanismo di risoluzione dei nomi dei container in indirizzi IP fornito da Docker quando si impiega una âuser defined networkâ (my-net in questo caso). Per la connessione al database server lâistruzione da eseguire è:
mysql -u root -h mysql-server1 -pUna volta connessi al server che si trova nellâaltro container (mysql-server1) è, ad esempio,
possibile eseguire gli script contenuti nella cartella /sql-stuff con il comando source, come
mostrato nel tutorial âexecute sql file in mysqlâ:
Supponendo di avere lo script con le query SQL nel file allâindirizzo: /sql-stuff/path/to/scripts/script.sql il comando di mysql per importare un database è:
source /sql-stuff/path/to/scripts/script.sqlAd esempio, supponendo di avere lo script per la creazione del database classicmodels nel percorso: /sql-stuff/mysqlsampledatabase/mysqlsampledatabase.sql, il comando diventa:
source /sql-stuff/mysqlsampledatabase/mysqlsampledatabase.sqlCreazione di un container di MariaDB
Sezione intitolata âCreazione di un container di MariaDBâCome riportato nella pagina di MariaDB su Docker Hub: âMariaDB Server is one of the most popular database servers in the world. Itâs made by the original developers of MySQL and guaranteed to stay open source. Notable users include Wikipedia, DBS Bank, and ServiceNow. The intent is also to maintain high compatibility with MySQL, ensuring a library binary equivalency and exact matching with MySQL APIs and commands. MariaDB developers continue to develop new features and improve performance to better serve its usersâ
PerchĂŠ MariaDB?
Sezione intitolata âPerchĂŠ MariaDB?â- Mariadb vs. MySQL
- Differenze tra MariaDB e MySQL
- Documentazione ufficiale di MariaDB
# si scarichi l'immagine di `MariaDB` nella versione LTS (Long Term Support)docker pull mariadb:lts
# creazione di un volume per lo storage dei datidocker volume create mariadb-server1-vol# si verifichi che il volume sia stato creato correttamentedocker volume lsdocker volume inspect mariadb-server1-volCreazione e avvio di un container di MariaDB con configurazione minimale
Sezione intitolata âCreazione e avvio di un container di MariaDB con configurazione minimaleâĂ possibile anche configurare il riavvio automatico come descritto in nella documentazione di MariaDB:
docker run -d \ --name mariadb-server1 \ --network my-net \ --restart unless-stopped \ -p 3306:3306 \ -v mariadb-server1-vol:/var/lib/mysql \ --env MARIADB_ROOT_PASSWORD=root \ mariadb:ltsà anche possibile usare le variabili della shell. Ad esempio, la password può essere letta da una variabile:
root_password="root"docker run -d \ --name mariadb-server1 \ --network my-net \ --restart unless-stopped \ -p 3306:3306 \ -v mariadb-server1-vol:/var/lib/mysql \ --env MARIADB_ROOT_PASSWORD="$root_password" \ mariadb:ltsSi verifichi che il container sia partito:
docker psAccesso a MariaDB dallâinterno del container con il comando exec
Sezione intitolata âAccesso a MariaDB dallâinterno del container con il comando execâIl comando exec permette di accedere come se si avesse il server installato localmente.
docker exec -it mariadb-server1 /bin/bash
# localmente nella shell del container:mariadb -uroot -p
# oppure usando una shell del Docker Host (il PC utilizzato)mariadb -hlocalhost -uroot -pCreazione di un container client per MariaDB
Sezione intitolata âCreazione di un container client per MariaDBâCome applicativo client per il database server di âMariaDBè anche possibile utilizzare un altro container diMariaDB` collegato alla stessa subnet. In questo container verrĂ lanciata solo lâapplicazione client e non anche il server.
docker run -it --rm \ --name mariadb-client \ --network my-net \ mariadb:lts \ mariadb -hmariadb-server1 -uroot -proot# oppuredocker run -it --rm \ --name mariadb-client \ --network my-net \ -v ~/my-dev/sql-stuff:/sql-stuff \ mariadb:lts \ mariadb -hmariadb-server1 -uroot -p$root_passwordĂ anche possibile lanciare un container a partire dallâimmagine di MariaDB e utilizzare la shell Bash. In questo caso lâaccesso al server verrĂ eseguito con un successivo comando interno al container. Questa configurazione è utile quando si vuole prima operare con la Bash e poi successivamente collegarsi al server. Nel comando di avvio del container mostrato sotto è anche stato fatto un bind mount su una
cartella contenente alcuni script SQL.
docker run -it --rm \ --name mariadb-client \ --network my-net \ -v ~/my-dev/sql-stuff:/sql-stuff \ mariadb:lts \ /bin/bashOppure, si può accedere al server di MariaDB con il comando:
mariadb -u root -h mariadb-server1 -pPer connettersi direttamente dentro al container di MariaDB
docker exec -it mariadb-server1 /bin/bashStop del container
docker stop mariadb-server1Esecuzione di un container giĂ creato in precedenza
docker start mariadb-server1Riavvio del container
docker restart mariadb-server1Rimozione del container
docker rm mariadb-server1Rimozione del container e dei volumi anonimi collegati
docker rm -v mariadb-server1Connessione su una porta diversa da quella di default per MySQL e MariaDB
Sezione intitolata âConnessione su una porta diversa da quella di default per MySQL e MariaDBâLanciare un server di MySQL su una porta diversa da quella standard. Nellâesempio seguente viene lanciato un container di MySQL con un port mapping 3307:3306
docker run -d \ --name mysql-server2 \ --network my-net \ --restart unless-stopped \ -v mysql-server2-vol:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -p 3307:3306 \ mysql:latestPer connettersi con lâapplicativo MySQL Monitor (dalla shell) occorre specificare anche il parametro
-P port_number, come nellâesempio seguente (dalla WSL):
mysql -u root -h 127.0.0.1 -P 3307 -pNota: il parametro -P permette di specificare la porta di connessione. Nel caso di connessione da un altro container:
mysql -u root -h mysql-server2 -P 3307 -pLanciare un server di MariaDB su una porta diversa da quella standard. Nellâesempio seguente viene lanciato un container di MariaDB con un port mapping 3308:3306
docker run -d \ --name mariadb-server2 \ --network my-net \ --restart unless-stopped \ -p 3308:3306 \ -v mariadb-server2-vol:/var/lib/mysql \ --env MARIADB_ROOT_PASSWORD=root \ mariadb:ltsPer connettersi con lâapplicativo MySQL Monitor (dalla shell) occorre specificare anche il parametro
-P port_number, come nellâesempio seguente (dalla WSL):
mariadb -u root -h 127.0.0.1 -P 3308 -pNel caso di connessione da un altro container:
mariadb -u root -h mariadb-server2 -P 3308 -pBackup, restore, or migrate data volumes
Sezione intitolata âBackup, restore, or migrate data volumesâGuida generale a backup, restore e migrazione di volumi Docker
Backup di un volume
Sezione intitolata âBackup di un volumeâGuida al backup di un volume Docker
Per effettuare il backup di un volume si può procedere come indicato dalla documentazione di Docker. Ad esempio, si riprenda il container dbstore creato in precedenza e si supponga di voler effettuare il backup dei suoi volumi. Per ottenere il backup dei volumi del container dbstore si crei un altro container con una immagine di Linux (ad esempio Ubuntu) che monti i volumi del container dbstore e, in aggiunta, abbia un bind mount con una cartella del Docker Host dove si vuole mettere il backup di dbdata. Questo container è usato per lanciare il comando tar per creare una cartella compressa di tutto il contenuto della cartella dbdata del container dbstore. Il file compresso viene creato nella cartella /backup del container che è mappato sulla working directory:
docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdataConfigurazioni del DBMS
Sezione intitolata âConfigurazioni del DBMSâLettura delle impostazioni del DBMS Server - MariaDB
Sezione intitolata âLettura delle impostazioni del DBMS Server - MariaDBâRiferimenti nella documentazione:
Le impostazioni del server, descritte nella documentazione ufficiale di MariaDB possono essere consultate in diversi modi:
-
dal client di MariaDB
SHOW VARIABLES \Goppure:SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES \G -
dalla shell del sistema operativo (dallâinterno del container Docker) si potrĂ , ad esempio, vedere la configurazione del server, con il comando:
Finestra del terminale mariadbd --verbose --help | grep time_zone -
dallâapplicazione client (
mariadbmonitor)SELECT @@global.time_zone;
Configurazione delle impostazioni del DBMS - MariaDB
Sezione intitolata âConfigurazione delle impostazioni del DBMS - MariaDBâLe impostazioni del DBMS possono essere eseguite in diversi modi:
-
alla partenza del server (
mariadbd) come command line argument. Ad esempio, dalla shell del container di MariaDB si può eseguire il comando seguente per impostare iltime zonedel server:Finestra del terminale mariadbd --default-time-zone="+02:00"Se si utilizza un container Docker, si può, ad esempio, lanciare il container di prova come mostrato di seguito (questo container verrà rimosso automaticamente quando verrà fermato):
Finestra del terminale docker run -d --rm \--name mariadb-server-test \--network my-net \-p 3309:3306 \--env MARIADB_ROOT_PASSWORD=root \mariadb:lts --default-time-zone "+02:00" -
Utilizzando un file di configurazione
.cnf, come mostrato nel paragrafo seguente
Creazione di un container di MariaDB con configurazione diversa da quella minimale - uso di file .cnf
Sezione intitolata âCreazione di un container di MariaDB con configurazione diversa da quella minimale - uso di file .cnfâIn alcune circostanze occorre creare un container di MariaDB con configurazioni diverse da quelle predefinite. MariaDB ha un sistema di configurazioni che permettono di definire il comportamento del DBMS in base alle proprie esigenze.
La configurazione di MariaDB può essere cambiata, seguendo la documentazione ufficiale:
- server system variables
- configurazione di MariaDB con file
- default option file locations on Linux and Mac
Alla partenza, MariaDB legge una serie di configurazioni da alcuni file che sono specificati nella documentazione. Seguendo le indicazioni riportate nella documentazione dellâimmagine Docker di MariaDB
nella sezione âUsing a custom MariaDB configuration fileâ, si deduce che è possibile impostare parametri specifici di configurazione scrivendo, un file con estensione .cnf che deve essere montato in sola lettura nella cartella /etc/mysql/conf.d. Infatti, i file di configurazione messi nella cartella /etc/mysql/conf.d vengono incorporati nella configurazione generale di MariaDB richiamata dal file /etc/mysql/my.cnf.
Come esempio di configurazione del DBMS si crei un file di testo chiamato my-config.cnf in una cartella della WSL Ubuntu,
ad esempio ~/my-dev/mariadb-config/mariadb-server1. La cartella ~/my-dev/mariadb-config/mariadb-server1 verrĂ collegata in bind mount con la cartella /etc/mysql/conf.d. Siccome il file /etc/mysql/my.cnf richiama eventuali file di configurazioni presenti nella cartella /etc/mysql/conf.d, lâeffetto complessivo sarĂ quello di applicare le configurazioni del file my-config.cnf, assieme alle altre configurazioni del DBMS.
Nel file my-config.cnf si inserisca il seguente contenuto:
[server]default-time-zone=+02:00Lâimpostazione inserita consente di aver il time zone di MariaDB impostato sullâora di Roma. Si può verificare che, senza questa configurazione, il server è impostato su UTC 00:00. Come verifica si può eseguire lâistruzione SELECT NOW(); e vedere il risultato.
# si fermi il server di mariadb (nel caso fosse in esecuzione)docker stop mariadb-server1# si rimuova il containerdocker rm mariadb-server1# si faccia partire ripartire un nuovo container con le impostazioni inserite nel file my-config.cnf con il seguente comando:docker run -d \ --name mariadb-server1 \ --network my-net \ --restart unless-stopped \ -p 3306:3306 \ -v mariadb-server1-vol:/var/lib/mysql \ -v ~/my-dev/mariadb-config/mariadb-server1:/etc/mysql/conf.d:ro \ --env MARIADB_ROOT_PASSWORD=root \ mariadb:ltsConfigurazione di MariaDB - uso dellâapplicazione client
Sezione intitolata âConfigurazione di MariaDB - uso dellâapplicazione clientâUtilizzando lâapplicazione client mariadb (come utente amministrativo) è possibile configurare il server su diversi parametri. Ad esempio per configurare il time_zone è possibile eseguire il comando:
-- https://stackoverflow.com/questions/930900/how-do-i-set-the-time-zone-of-mysqlSET GLOBAL time_zone='+02:00';Lettura delle impostazioni del DBMS Server - MySQL
Sezione intitolata âLettura delle impostazioni del DBMS Server - MySQLâLe impostazioni del server sono descritte nella documentazione ufficiale di MySQL:
Le impostazioni del server di MySQL possono essere consultate in due modi:
-
dal client di MySQL
SHOW VARIABLES \G -
dalla shell del sistema operativo (dallâinterno del container Docker), ad esempio, con il comando:
Finestra del terminale mysqld --verbose --help
Configurazione delle impostazioni del DBMS - MySQL
Sezione intitolata âConfigurazione delle impostazioni del DBMS - MySQLâLe impostazioni del DBMS possono essere configurate in diversi modi:
-
alla partenza del server (mysqld) come command line argument. Ad esempio, dalla shell del container di MySQL si può eseguire il comando
mysqld --default-time-zone="+02:00"Se si utilizza un container Docker, si può, ad esempio, lanciare un container di prova come mostrato di seguito (questo container verrà rimosso automaticamente quando verrà fermato):
Finestra del terminale docker run -d --rm \--name mysql-server-test \--network my-net \-e MYSQL_ROOT_PASSWORD=root \-p 3307:3306 \mysql:latest --default-time-zone "+02:00" -
Utilizzando un file di configurazione .cnf, come mostrato nel paragrafo seguente.
Creazione di un container di MySQL con configurazione diversa da quella minimale - uso del file .cnf
Sezione intitolata âCreazione di un container di MySQL con configurazione diversa da quella minimale - uso del file .cnfâLa configurazione di MySQL può essere cambiata, seguendo la documentazione ufficiale:
Infatti, i file di configurazione messi nella cartella /etc/mysql/conf.d vengono incorporati nella configurazione generale di MySQL richiamata dal file /etc/mysql/my.cnf
Come esempio di configurazione del DBMS si crei un file di testo chiamato my-config.cnf in una cartella della WSL Ubuntu,
ad esempio ~/my-dev/mysql-config/mysql-server1. La cartella ~/my-dev/mariadb-config/mariadb-server1 verrĂ collegata in bind mount con la cartella /etc/mysql/conf.d. Siccome il file /etc/mysql/my.cnf richiama eventuali file di configurazioni presenti nella cartella /etc/mysql/conf.d, lâeffetto complessivo sarĂ quello di applicare le configurazioni del file my-config.cnf, assieme alle altre configurazioni del DBMS.
Nel file my-config.cnf si inserisca il seguente contenuto:
[server]default-time-zone=+02:00Lâimpostazione inserita consente di aver il time zone di MySQL impostato sullâora di Roma. Si può verificare che, senza questa configurazione, il server è impostato su UTC 00:00. Come verifica si può eseguire lâistruzione SELECT NOW(); e vedere il risultato.
Per applicare le impostazioni si fermino i server che fossero eventualmente in ascolto sulla stessa porta del Docker host (nel caso fosse in esecuzione).
Si lanci il server di MySQL e si verifichi che lâimpostazione inserita nel file di configurazione sia stata accettata correttamente:
docker run -d \ --name mysql-server1 \ --network my-net \ --restart unless-stopped \ -v mysql-server1-vol:/var/lib/mysql \ -v ~/my-dev/mysql-config/mysql-server1:/etc/mysql/conf.d:ro \ -e MYSQL_ROOT_PASSWORD=root \ -p 3306:3306 \ mysql:latestConfigurazione di MySQL - uso dellâapplicazione client
Sezione intitolata âConfigurazione di MySQL - uso dellâapplicazione clientâUtilizzando lâapplicazione client mariadb (come utente amministrativo) è possibile configurare il server su diversi parametri. Ad esempio per configurare il time_zone è possibile eseguire il comando:
-- https://stackoverflow.com/questions/930900/how-do-i-set-the-time-zone-of-mysqlSET GLOBAL time_zone='+02:00';