Esplorando Docker
Si parla spesso di Docker e di come permetta di avviare velocemente anche le applicazioni più complesse; ma si approfondisce sempre poco sugli strumenti di gestione e troubleshooting: ci sono dei comandi sottovalutati che potrebbero migliorare l’esperienza complessiva utilizzando Docker.
Installiamo Docker
Prendiamo come esempio una distribuzione basata su Debian.
Dalla nostra Debian 11 lanciamo
# apt-get remove docker docker-engine docker.io containerd runc
per assicurarci di non aver pacchetti (ufficiali e non) installati. Aggiungiamo il repository e installiamo Docker
# apt-get update
# apt-get install ca-certificates curl gnupg lsb-release -y
# mkdir -p /etc/apt/keyrings
# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# apt-get update
# apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
Verifichiamo che tutto funzioni.
Assicuriamoci che il servizio sia attivo e avviato al boot
# systemctl enable --now docker
Avviamo un container per testare il funzionamento
# docker run --name test-nginx -p 80:80 -d nginx
Avremo un container che espone nginx sulla porta 80 della macchina host.
Testiamo anche docker compose
in /opt/nginx creiamo il file docker-compose.yml
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
environment:
- NGINX_HOST=test.it
- NGINX_PORT=80
e poi lanciamo
# docker compse up -d
in questo caso avvieremo un container nginx sulla porta 8080 della macchina host.
docker system
Docker ha un comando di system che fornisce alcune informazioni a livello di sistema. Come prima cosa stampiamo l’help
# docker system --help
Usage: docker system COMMAND
Manage Docker
Commands:
df Show docker disk usage
events Get real time events from the server
info Display system-wide information
prune Remove unused data
Run 'docker system COMMAND --help' for more information on a command.
docker system df
Ti sarà di certo capitato di ricevere warning o errori per lo spazio disco in esaurimento oppure già terminato. Ho visto i trucchi più fantasiosi per capire se si trattasse del container, volumi oppure la macchina host (compreso l’immancabile du -mhs /var/lib/docker/*).
Questo sottocomando sorprenderà molti:
# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 1 141.5MB 0B (0%)
Containers 2 2 2.19kB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
Verrà stampata una “tabella” contenete tutte le informazioni necessarie a trovare quello che cerchiamo.
docker system prune
Periodicamente ci troviamo a fare pulizia e cerchiamo di rimuovere: * immagini inutilizzate; * reti inutilizzate; * container morti e in decomposizione; * volumi inutillizati…
Con questo comando toglieremo in un unico colpo di spugna tutto ciò che non è più utilizzato e necessario.
# docker system prune --help
Usage: docker system prune [OPTIONS]
Remove unused data
Options:
-a, --all Remove all unused images not just dangling ones
--filter filter Provide filter values (e.g. 'label=<key>=<value>')
-f, --force Do not prompt for confirmation
--volumes Prune volumes
Di default il comando non elimina i volumi per cui se volessimo fare pulizia anche di questi dovremmo specificarlo
# docker system prune --volumes -f
Deleted Containers:
4637463a32323672b672d378969887f411ce9139e74e089ede
Deleted Networks:
Example
proxynet
mynet
Deleted Volumes:
test
persistente
Total reclaimed space: 30MB
docker system events
Questo comando permette di ricevere in diretta le operazioni effettuate sul demone, come l’avvio di un container, oppure la rimozione di un’immagine.
# docker system events
2022-05-29T09:21:05.159915450Z container kill fcc9a3f8e01915bcd89c7abffa47b9c9dc7b1c3c7099aa31f298821d22408bfa (image=nginx, maintainer=NGINX Docker Maintainers <[email protected]>, name=test-nginx, signal=3)
2022-05-29T09:21:05.249724659Z container die fcc9a3f8e01915bcd89c7abffa47b9c9dc7b1c3c7099aa31f298821d22408bfa (exitCode=0, image=nginx, maintainer=NGINX Docker Maintainers <[email protected]>, name=test-nginx)
2022-05-29T09:21:05.363078028Z network disconnect 864d1514f26544ea6fe2bc227971e6ebf2d2d3513f2c7729c5762918fd6227d4 (container=fcc9a3f8e01915bcd89c7abffa47b9c9dc7b1c3c7099aa31f298821d22408bfa, name=bridge, type=bridge)
2022-05-29T09:21:05.386740211Z container stop fcc9a3f8e01915bcd89c7abffa47b9c9dc7b1c3c7099aa31f298821d22408bfa (image=nginx, maintainer=NGINX Docker Maintainers <[email protected]>, name=test-nginx)
In questa simulazione ho fermato il contaner creato in precedenza (nginx-test).
docker context
Questo è un altro bellissimo sottocomando di cui non molti sono a conoscenza. La cosa interessante è che una volta creato un context può essere riutilizzato in seguito per altre finalità.
Se io volessi conoscere i contaner in esecuzione sull’host creato prima dovrei lanciare
# docker --host ssh://[email protected] ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9fa5e058797 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx-web-1
fcc9a3f8e019 nginx "/docker-entrypoint.…" About an hour ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp test-nginx
e per ogni comando dovrei specificare –host ssh://[email protected] .
Docker context ci semplifica la vita
# docker context create remote --description "Remote Debian docker" --docker "host=ssh://[email protected]"
remote
Successfully created context "remote"
ora per interagine con il demone docker sulla macchina Debian 11 mi basterà
# docker -c remote ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9fa5e058797 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx-web-1
fcc9a3f8e019 nginx "/docker-entrypoint.…" About an hour ago Up 10 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp test-nginx
in alternativa posso utilizzare il context remote come default
# docker context use remote
remote
Current context is now "remote"
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9fa5e058797 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx-web-1
fcc9a3f8e019 nginx "/docker-entrypoint.…" About an hour ago Up 11 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp test-nginx
Per tornare indietro basterà lanciare
# docker context use default
default
Current context is now "default"
docker pause e unpause
Il comando pause può essere utile in quei contesti nei quali hai necessità che un container sia fermo mentre un altro fa delle operazioni senza fermarlo o eliminarlo. La sintassi è molto semplice ma in alcuni contesti è davvero utile.
# docker pause --help
Usage: docker pause CONTAINER [CONTAINER...]
Pause all processes within one or more containers
# docker unpause --help
Usage: docker unpause CONTAINER [CONTAINER...]
Unpause all processes within one or more containers
Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.
Risorse: