Marvin Pascale

[B.Log]

29 Maggio 2022

Esplorando Docker

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 <docker-maint@nginx.com>, name=test-nginx, signal=3)
2022-05-29T09:21:05.249724659Z container die fcc9a3f8e01915bcd89c7abffa47b9c9dc7b1c3c7099aa31f298821d22408bfa (exitCode=0, image=nginx, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, 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 <docker-maint@nginx.com>, 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://root@167.235.76.18 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://root@167.235.76.18 .

Docker context ci semplifica la vita

# docker context create remote --description "Remote Debian docker" --docker "host=ssh://root@167.235.76.18"
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: