Introduzione

La connessione a un contenitore Docker in esecuzione è utile quando si desidera vedere cosa sta accadendo all'interno del contenitore. Se il contenitore Docker non funziona come previsto, è possibile collegarsi al contenitore o ottenere una shell del contenitore ed eseguire comandi come ps o top, installare nuovi pacchetti etc.

In questo tutorial, spiegheremo come collegarsi al processo in esecuzione principale del contenitore e come ottenere una shell in un contenitore in esecuzione.

Collegarsi a un contenitore

Sebbene sia possibile eseguire più processi in un contenitore, la maggior parte dei contenitori docker esegue solo un singolo processo. Il comando che viene eseguito all'avvio di un contenitore viene specificato usando l' istruzione ENTRYPOINT e/o RUN.

Il comando docker attach consente di collegare il terminale al contenitore in esecuzione. Ciò è utile quando si desidera vedere ciò che è scritto nell'output standard in tempo reale o per controllare il processo in modo interattivo.

Per capire meglio come funziona il comando attach, eseguiamo un nuovo contenitore Nginx separato usando l'immagine Nginx ufficiale.

docker container run --name my_nginx -d -p 8080:80 nginx

L' opzione -p 8080:80 indica a Docker di associare la porta 8080 del contenitore alla porta 80 sul computer host.

Elencare i contenitori per assicurarsi che il contenitore “my_nginx” sia in esecuzione:

docker container ls

Dovresti ricevere un messaggio di output simile al seguente:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
37dh4dh47mlk        nginx               "nginx -g 'daemon of…"   5 minutes ago       Up 6 seconds        0.0.0.0:8080->80/tcp   my_nginx

Allegare al contenitore utilizzando l'ID o il nome del contenitore:

docker container attach my_nginx

Il comando predefinito dell'immagine nginx che viene eseguito quando si esegue il contenitore è impostato su CMD ["nginx", "-g", "daemon off;"]. Quando si esegue il comando attach, il terminale si collega al processo nginx.

Apri l'indirizzo 127.0.0.1:8080 nel tuo browser e vedi l'output del processo nginx in tempo reale.

192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.33.71:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"

Per ottenere l'accesso ai registri del contenitore, è consigliabile utilizzare il comando docker logs.

Per uscire dal contenitore senza fermarlo, utilizzare la combinazione di tasti CTRL-p CTRL-q. Premendo CTRL-c si ferma il contenitore.

Porta una shell in un contenitore

Il comando docker exec consente di eseguire comandi all'interno di un container in esecuzione.

Per vedere come funziona e come utilizzare il comando exec, avviare un nuovo contenitore. Useremo l'immagine ufficiale di MySQL:

docker container run --name my_mysql -d mysql

Questo creerà un contenitore chiamato "my_mysql".

Per eseguire un comando all'interno del contenitore, eseguire il comando seguente:

docker container exec -it my_mysql ls /var

L'opzione -i sta per interattivo e -t dice a Docker di allocare un pseudo dispositivo TTY. Il comando ls elencherà tutti i file e le directory all'interno della directory /var del contenitore:

backups  cache	lib  local  lock  log  mail  opt  run  spool  tmp

Per ottenere una shell nel contenitore, ovvero per entrare nel contenitore, avviare una nuova sessione della shell eseguendo il binario della shell. È possibile utilizzare sh, bash o qualsiasi altra shell inclusa nell'immagine.

Il comando seguente creerà una nuova sessione Bash all'interno del contenitore:

docker container exec -it my_mysql /bin/bash

Il prompt dei comandi cambierà, indicando che ora stai lavorando sulla shell del contenitore.

Da qui, puoi eseguire i comandi come faresti su qualsiasi altro server Linux. Ad esempio, per ottenere un elenco delle variabili di ambiente correnti digitare env:

env

L'output sarà simile al seguente:

HOSTNAME=r847dj4hb9fr
MYSQL_ROOT_PASSWORD=secret
PWD=/
HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.7
MYSQL_VERSION=8.0.17-1debian9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

Conclusione

I comandi docker exec e docker attach consentono di connettersi a un contenitore in esecuzione. Per ottenere una shell interattiva in un contenitore, utilizzare il comando exec per avviare una nuova sessione di shell. Il comando attach collega il terminale a un container in esecuzione.