LINUX

2 modi per accedere tramite SSH a un contenitore Docker in esecuzione

ssh nel contenitore docker

In questo tutorial, vedremo come ottenere la shell bash su un contenitore Docker in esecuzione in background. Tratterà anche come ssh in un contenitore docker che è stato avviato e lasciato in esecuzione in background senza una sessione di console attiva.

L’adozione di Docker è stata straordinaria, specialmente nel mondo dei microservizi e dello sviluppo. La maggior parte dei container Docker che vengono eseguiti per lunghi periodi di tempo non dispone di una console shell attiva. Probabilmente ti collegherai alla shell bash su richiesta, cioè quando vorrai eseguire alcuni comandi sul terminale. Un’alternativa a questo sarà ssh al contenitore utilizzando un indirizzo IP.

Ottenere bash di un contenitore in esecuzione in background può essere fatto in due modi

1) Utilizzando il comando docker exec

Il motore Docker ha uno strumento a riga di comando roustabout che viene utilizzato per interagire con i contenitori. Opzione ordine eseguire viene utilizzato per eseguire un comando in un contenitore in esecuzione. Passando alcuni parametri dovremmo essere in grado di ottenere la sessione bash. La sintassi del comando utilizzata è:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Di seguito è riportato un elenco di opzioni che possono essere utilizzate con esso.

-d, –detach Modalità indipendente: eseguire il comando in background
-i, –interattivo Mantieni STDIN aperto anche se non è collegato
-t, –tty Assegna uno pseudo-TTY
-u, –utente stringa Nome utente o UID (formato: [:<group|gid>])
-w, –workdir string Directory di lavoro all’interno del contenitore

Il nostro interesse è nelle opzioni t e loro perché bash deve essere eseguito in modalità interattiva. Consideriamo un esempio per chiarire questo punto.

Estrai l’immagine di Nginx Docker:

# docker pull nginx 
Using default tag: latestlatest: Pulling from library/nginx
f2aa67a397c4: Pull complete 3c091c23e29d: Pull complete 4a99993b8636: Pull complete 
Digest: sha256:0edf702c890e9518b95b2da01286509cd437eb994b8d22460e40d72f6b79be49Status: 
Downloaded newer image for nginx:latest

Avvia un contenitore di test in background in base all’immagine docker scaricata.

# docker run --name nginx-bg -d nginx 
3bd76e19ad6ce2ff15657ebf4de4cc42eb503c55f608071a438de6ca709ba73b

Questo avvierà un contenitore chiamato nginx-bg sullo sfondo da nginx immagine della finestra mobile. Controlla per confermare che il contenitore funzioni:

# docker ps

Ora esegui il seguente comando per ottenere la console bash su questo contenitore.

# docker exec -it nginx-bg /bin/bash
root@3bd76e19ad6c:/# apt-get update
Get:2 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:1 http://cdn-fastly.deb.debian.org/debian stretch InRelease 
Get:3 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Hit:4 http://cdn-fastly.deb.debian.org/debian stretch Release
Fetched 185 kB in 2s (83.4 kB/s) 
Reading package lists... Done

Dove nginx-bg è il nome del contenitore e /bin/bash è il percorso del binario bash sul contenitore. Una volta eseguiti i comandi sulla shell bash, puoi uscire digitando Uscita comando.

root@3bd76e19ad6c:/# exit

2) Utilizzando il comando docker attach

Un metodo alternativo a docker exec è docker attach. La sintassi è

# docker attach <container-name>

Quindi nel nostro caso eseguiremo:

# docker attach nginx-bg

Questo dovrebbe portarti nella shell bash per impostazione predefinita.

ssh in un contenitore in esecuzione

Se vuoi eseguire ssh su un contenitore Docker in esecuzione, hai bisogno di un indirizzo IP del contenitore o di un nome host configurato su /etc/hosts o di un record DNS valido sulla tua rete.

Se non conosci l’indirizzo IP del contenitore, puoi ottenerlo utilizzando il comando seguente:

export INSTANCE_NAME="nginx-bg"
docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" $INSTANCE_NAME

Esempio:

# export INSTANCE_NAME="nginx-bg"
# docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" $INSTANCE_NAME
172.17.0.7

Tieni presente che puoi sostituire il nome del contenitore con il relativo ID. Ho ottenuto che l’indirizzo IP sia 172.17.0.7, prova a eseguire il ping per vedere se risponde.

# ping -c 2 172.17.0.7

PING 172.17.0.7 (172.17.0.7) 56(84) bytes of data.
64 bytes from 172.17.0.7: icmp_seq=1 ttl=64 time=0.107 ms
64 bytes from 172.17.0.7: icmp_seq=2 ttl=64 time=0.058 ms
--- 172.17.0.7 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.058/0.082/0.107/0.026 ms

Devi avere ssh configurato sul contenitore prima di eseguire il comando ssh su di esso. Una volta configurato, puoi ssh utilizzando il nome utente e l’indirizzo IP del contenitore.

# ssh root@172.17.0.7 
root@172.17.0.7's password: 
Linux 672175da3a51 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@672175da3a51:~#

SSH senza password tra i contenitori

Se hai bisogno di un’autenticazione senza password, considera di copiare la tua chiave pubblica SSH nel contenitore quando lo esegui. Non consiglio di creare un’immagine con la chiave pubblica su di essa, ma piuttosto di avere il file sul sistema host che ha tutte le chiavi pubbliche autorizzate.

Creiamo un file:

# mkdir ~/container-ssh-keys
# vim  ~/container-ssh-keys/authorized_keys
# chmod 0600 ~/container-ssh-keys/authorized_keys

Quindi aggiungi la tua chiave SSH pubblica al file, puoi aggiungerne quante ne vuoi. Ora, quando avvii il contenitore, mappa questo file a /root/.ssh/authorized_keys sul contenitore, ad es

# docker run --name mycon -it -v $HOME/container-ssh-keys/authorized_keys:/root/.ssh/authorized_keys 
ubuntu:16.04 /bin/bash

Dovresti quindi essere in grado di eseguire ssh dal tuo sistema host con la coppia di chiavi private della chiave pubblica copiata senza che ti venga chiesta la password.

# ssh root@container-ip

Leggi anche:

Questo segna la fine della guida. Spero che questo sia stato utile e un buon riferimento quando si lavora con i contenitori Docker.

Related Articles

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Back to top button
Close