Come faccio a entrare nella shell di un contenitore Docker?

Sto iniziando a lavorare con Docker. Sto usando l'immagine base di WordPress e docker-compose.

Sto cercando di entrare con ssh in uno dei contenitori per ispezionare i file/directory che sono stati creati durante la costruzione iniziale. Ho provato a eseguire docker-compose run containername ls -la, ma questo non ha fatto nulla. Anche se lo facesse, preferirei avere una console dove posso attraversare la struttura delle directory, piuttosto che eseguire un singolo comando. Qual è il modo giusto per farlo con Docker?

Soluzione

docker attach ti permetterà di connetterti al tuo contenitore Docker, ma questo non è proprio la stessa cosa di ssh. Se il tuo contenitore sta eseguendo un webserver, per esempio, docker attach ti connetterà probabilmente allo stdout del processo del web server. Non ti darà necessariamente una shell.

Il comando docker exec è probabilmente quello che stai cercando; questo ti permetterà di eseguire comandi arbitrari all'interno di un contenitore esistente. Per esempio:

docker exec -it  bash

Naturalmente, qualsiasi comando si stia eseguendo deve esistere nel filesystem del contenitore.

Nel comando precedente `è il nome o l'ID del contenitore di destinazione. Non importa se stai usando o menodocker compose; basta eseguiredocker ps` e usare o l'ID (una stringa esadecimale visualizzata nella prima colonna) o il nome (visualizzato nella colonna finale). Ad esempio, dato:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

Posso eseguire:

$ docker exec -it web ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: eth0:  mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

Potrei realizzare la stessa cosa eseguendo:

$ docker exec -it d2d4a89aaee9 ip addr

Allo stesso modo, potrei avviare una shell nel contenitore;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
Commentari (8)

docker exec sarà sicuramente una soluzione. Un modo semplice per lavorare con la domanda che hai posto è quello di montare la directory all'interno di Docker nella directory del sistema locale.

In modo da poter visualizzare le modifiche nel percorso locale istantaneamente.


docker run -v /Users/<path>:/
Commentari (2)

Un'altra opzione è usare nsenter.

PID=$(docker inspect --format {{.State.Pid}} )
nsenter --target $PID --mount --uts --ipc --net --pid
Commentari (4)