Comment entrer dans le shell d'un conteneur Docker ?

Je commence à travailler avec Docker. J'utilise l'image de base de WordPress et docker-compose.

J'essaie de me connecter à l'un des conteneurs pour inspecter les fichiers/répertoires qui ont été créés lors de la construction initiale. J'ai essayé d'exécuter docker-compose run containername ls -la, mais cela n'a rien donné. Même si c'était le cas, je préférerais avoir une console où je peux parcourir la structure des répertoires, plutôt que d'exécuter une seule commande. Quelle est la bonne façon de procéder avec Docker ?

Solution

docker attach vous permettra de vous connecter à votre conteneur Docker, mais ce n'est pas vraiment la même chose que ssh. Si votre conteneur fait tourner un serveur web, par exemple, docker attach vous connectera probablement au stdout du processus du serveur web. Il ne vous donnera pas nécessairement un shell.

La commande docker exec est probablement ce que vous recherchez ; elle vous permettra d'exécuter des commandes arbitraires à l'intérieur d'un conteneur existant. Par exemple :

docker exec -it  bash

Bien sûr, la commande que vous exécutez doit exister dans le système de fichiers du conteneur.

Dans la commande ci-dessus, `est le nom ou l'ID du conteneur cible. Peu importe que vous utilisiez ou nondocker compose; exécutez simplementdocker ps` et utilisez soit l'ID (une chaîne hexadécimale affichée dans la première colonne) ou le nom (affiché dans la dernière colonne). Par exemple, donné :

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

je peux l'exécuter :

$ 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

Je pourrais accomplir la même chose en exécutant :

$ docker exec -it d2d4a89aaee9 ip addr

De même, je pourrais lancer un shell dans le conteneur ;

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

docker exec sera certainement une solution. Une façon simple de travailler avec la question que vous avez posée est de monter le répertoire dans Docker sur le répertoire du système local.

Ainsi, vous pouvez voir les changements dans le chemin local instantanément.


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

Une autre option consiste à utiliser nsenter.

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