I container Docker forniscono ambienti isolati per l’esecuzione delle applicazioni, garantendo coerenza e portabilità. Quando si lavora con i container Docker, è fondamentale poter ispezionare e connettersi alle loro shell. In questo modo potete eseguire comandi, risolvere problemi e monitorare il comportamento dei container in tempo reale.

Questo articolo spiega come accedere ai container Docker locali e remoti sia per fare manutenzione che per eseguire gli aggiornamenti.

Perché è importante accedere ai container

L’accesso ai container è essenziale per una gestione efficace e per la risoluzione dei problemi negli ambienti containerizzati. Vi permette di analizzare i log e le informazioni di runtime del container e di identificare e risolvere facilmente gli errori.

L’accesso ai container vi permette anche di eseguire comandi per aggiornare rapidamente la configurazione, installare pacchetti e svolgere altre attività amministrative. Senza l’accesso, dovreste ricostruire l’intera immagine del container con la configurazione aggiornata, il che può essere lungo e inefficiente.

I container devono anche essere in grado di comunicare tra loro in un ecosistema applicativo distribuito. Per questo motivo avete bisogno di un accesso ai container per diagnosticare i comandi e garantire che la connettività tra i container sia sana.

Sebbene sia possibile accedere ai container attraverso il tradizionale protocollo Secure Shell (SSH), Docker offre diversi metodi integrati che vi aiutano a risparmiare tempo e ad aumentare l’efficienza. Questi includono:

  • docker exec
  • docker run
  • docker attach
  • docker compose exec
  • docker compose run

Ogni metodo ha i suoi specifici casi d’uso e vantaggi. Conoscere il comando giusto per il vostro caso d’uso può aiutarvi a ottimizzare il vostro approccio.

Come e perché usare docker exec

docker exec vi permette di accedere alla sessione shell di un container in esecuzione e di eseguire comandi senza dover avviare una nuova istanza. Questo comando non è persistente, cioè non verrà eseguito nuovamente se il container si spegne o si riavvia.

Per accedere a un container in esecuzione, dovete avere il suo nome o ID (potete ottenerlo eseguendo docker ps -a). Quindi, inseritelo nel seguente comando:

docker exec -it  /bin/bash

Il comando docker exec eseguito nel terminale per creare una shell bash all'interno di un container.
Accedere a un container con docker exec

Come e perché usare docker run

Il comando docker run vi permette di avviare un nuovo container e di accedere immediatamente alla sua shell. Per impostazione predefinita, questo container non è collegato alla vostra sessione di shell corrente, ma potete collegarlo usando l’opzione -it.

Il seguente comando vi permette di avviare un nuovo container, di collegarlo alla vostra sessione di shell corrente e di creare una shell bash:

docker run -it  /bin/bash

Il comando docker run eseguito nel terminale per avviare un container e creare una shell bash al suo interno.
Accedere al container con docker run.

Come e perché usare docker attach

Il comando docker attach è utile per il monitoraggio e il debug delle operazioni dei container. Vi permette di connettervi a un container in esecuzione e di visualizzare i suoi flussi di input, output ed errori standard in tempo reale.

Per usarlo, avviate il vostro container usando docker run. Poi, staccatevi da esso premendo Ctrl+P e Ctrl+Q. Potete anche fornire il flag -d per quel container.

Una volta che il vostro container è in esecuzione in background, accedetevi con il seguente comando:

docker attach 

docker attach eseguito nel terminale per accedere a un container.
Usare docker attach per accedere a un container.

Come e perché usare Docker Compose

Docker Compose vi permette di creare ed eseguire applicazioni Docker multi-container. Potete usarlo per definire i servizi che compongono la vostra applicazione in un file YAML, quindi usare quel file per avviare e gestire tutti i container insieme. È adatto agli ambienti di sviluppo e di test in cui è necessario avviare rapidamente ambienti complessi.

Per accedere a un container specifico già in esecuzione, eseguite il comando docker compose, seguito dal nome del servizio e dal comando che volete eseguire:

docker compose exec app /bin/bash

Questo comando avvia un nuovo processo all’interno del container che esegue il comando specificato. Potete usarlo per eseguire qualsiasi comando all’interno del container, comprese le shell interattive come bash.

Allo stesso modo, se volete avviare un nuovo container usando Docker Compose e ottenere accesso immediato ad esso, eseguite il comando qui sotto:

docker compose run app /bin/bash

Come vedete docker compose ha due diverse sintassi: docker-compose (versione 1) e docker compose (versione 2). La sintassi della versione 2 è più flessibile e potente, quindi vi consigliamo di usarla quando possibile.

I comandi docker compose run e docker compose exec vengono eseguiti nel terminale per accedere ai container.
Usare Docker Compose per accedere ai container

Come aggiungere un server SSH al container Docker

L’aggiunta di un server SSH al container Docker aiuta a gestire e risolvere i problemi delle applicazioni containerizzate. Un server SSH vi permette di accedere e gestire i container da remoto, di eseguire comandi e di controllare i log da qualsiasi luogo.

Potete aggiungere un server SSH includendolo nel file Docker prima di creare il container e collegandolo con un client SSH. In alternativa, potete aggiungere un accesso SSH temporaneo creando una shell all’interno di un container in esecuzione e installandovi un server SSH.

Includere un server SSH durante la creazione del container Docker

Quando costruite un container Docker, includere un server SSH all’interno del container può essere utile se desiderate accedere al container in modo persistente tramite SSH. Ciò consente l’accesso remoto e il debug del container durante lo sviluppo o la risoluzione dei problemi. L’inclusione di un server SSH all’interno del container vi permette anche di trasferire in modo sicuro i file da e verso il container.

Per incorporare un server SSH in fase di compilazione, apportate alcune modifiche al file Docker del container. Ecco un esempio di Dockerfile che include un server SSH:

FROM debian:latest

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root123' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

Un comando SSH eseguito nel terminal per accedere a un container.
Container Docker costruito con un server SSH

Questo codice crea un container con l’ultima immagine Debian e installa il server SSH. Inoltre, crea una nuova directory per il server SSH, imposta la password di root e abilita il login di root tramite la configurazione SSH.

Infine, espone la porta 22, la porta predefinita di SSH.

Per usare questo file Docker, costruite il container con il comando docker build e poi eseguite il container con docker run. Ecco un esempio:

docker build . -t ssh-container
docker run -d -p 2222:22 ssh-container

Questo comando crea un container tramite il Dockerfile e lo etichetta con il nome di ssh-container. Usate -d per eseguire il container in modalità distaccata. Quindi, mappate la porta 22 all’interno del container sulla porta 2222 del computer host con -p.

Una volta che il container è in esecuzione, potete accedere al suo SSH con il comando ssh:

ssh root@localhost-p 2222

Quando vi viene richiesta la password, digitate la password che avete impostato nel file YAML. In questo caso, è “root123”. Ora siete connessi al server SSH in esecuzione all’interno del container. Questo significa che potete eseguire il debug remoto o trasferire file da e verso il container.

Aggiungere temporaneamente un server SSH a un container Docker in esecuzione

Potete anche aggiungere un server SSH a un container in esecuzione utilizzando il comando docker exec:

docker exec <container_name_or_id> /bin/bash

Una volta ottenuto l’accesso al container, installate il server OpenSSH e avviate il daemon SSH:

apt update && apt install openssh-server && /usr/sbin/openssh -D

In questo modo si apre una nuova istanza del server SSH all’interno del container. Ora siete pronti a connettervi usando un client SSH sul vostro computer locale.

Potete connettervi al container tramite SSH solo se voi o il vostro team avete esposto la porta SSH durante la fase di esecuzione o di costruzione.

Connettersi al server SSH del container

Iniziate identificando l’indirizzo IP o l’hostname del container dalla vostra piattaforma o servizio di gestione dei container.

Per collegarvi all’indirizzo IP, usate il comando ssh:

ssh [username]@[container-ip-address]

Una volta richiesto, inserite la password per il nome utente specificato. Al posto della password, alcuni server SSH possono usare una chiave di sicurezza.

Ora dovreste avere una sessione di terminal remoto connessa al container.

Riepilogo

Con la crescente diffusione di Docker, è importante poter ispezionare i container in esecuzione nel vostro ambiente. Questa funzionalità vi permette di diagnosticare e risolvere i problemi durante lo sviluppo.

Docker offre anche una serie versatile di comandi integrati per varie attività di sviluppo. Potete usare questi comandi per ottimizzare il vostro flusso di lavoro senza dover ricorrere ai tradizionali metodi SSH.

Date un’occhiata a Kinsta per ospitare le vostre applicazioni, i vostri siti WordPress o i vostri database. Con Kinsta avete a disposizione un host veloce e sicuro che vi permette di distribuire i progetti su un’infrastruttura costruita sulla Premium Tier Network e sulle macchine C2 di Google Cloud Platform. Scegliete tra 37 data center e un CDN abilitato HTTP/3 con 260+ PoPs. Rimanete al sicuro con la tecnologia dei container isolati, due firewall potenti e una protezione DDoS avanzata alimentata da Cloudflare. Inoltre, potrete integrare le app o automatizzare i flussi di lavoro con l’API di Kinsta.

Marcia Ramos Kinsta

I'm the Editorial Team Lead at Kinsta. I'm a open source enthusiast and I love coding. With more than 7 years of technical writing and editing for the tech industry, I love collaborating with people to create clear and concise pieces of content and improve workflows.