web-dev-qa-db-fra.com

Comment entrer dans la coque d'un conteneur Docker?

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

J'essaie de ssh dans l'un des conteneurs pour inspecter les fichiers/répertoires créés lors de la construction initiale. J'ai essayé d'exécuter docker-compose run containername ls -la, mais cela n'a rien fait. Même si c'était le cas, je préférerais disposer d'une console permettant de parcourir la structure de répertoire plutôt que d'exécuter une seule commande. Quelle est la bonne façon de faire cela avec Docker?

730
Andrew

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 exécute un serveur Web, par exemple, docker attach vous connectera probablement au processus stdout du processus du serveur Web. Cela ne vous donnera pas nécessairement un shell.

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

docker exec -it <mycontainer> bash

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

Dans la commande ci-dessus, <mycontainer> est le nom ou l'ID du conteneur cible. Peu importe que vous utilisiez ou non docker compose; Il suffit d'exécuter docker ps et d'utiliser 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, étant donné:

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

Je peux courir:

$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,UP,LOWER_UP> 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 lançant:

$ docker exec -it d2d4a89aaee9 ip addr

De même, je pourrais démarrer un shell dans le conteneur;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
1143
larsks

Pour bash dans un conteneur en cours d'exécution, tapez ceci:

docker exec -t -i container_name /bin/bash
227
Agustí Sánchez

Disons que, pour des raisons qui vous appartiennent, vous voulez vraiment utiliser SSH. Cela prend quelques étapes, mais cela peut être fait. Voici les commandes que vous exécuteriez dans le conteneur pour le configurer.

apt-get update
apt-get install openssh-server

mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd

useradd --create-home --Shell /bin/bash --groups Sudo username ## includes 'Sudo'
passwd username ## Enter a password

apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)

Maintenant, vous pouvez même exécuter des applications graphiques (si elles sont installées dans le conteneur) en utilisant le transfert X11 vers le client SSH:

ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client

Voici quelques ressources connexes:

67
nobar

Remarque: cette réponse promeut un outil que j'ai écrit.

J'ai créé un serveur SSH conteneurisé que vous pouvez «coller» à n'importe quel conteneur en cours d'exécution. De cette façon, vous pouvez créer des compositions avec chaque conteneur. La seule exigence est que le conteneur possède Bash.

L'exemple suivant démarre un serveur SSH associé à un conteneur nommé "my-container".

docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

ssh localhost -p 2222

Lorsque vous vous connectez à ce service SSH (avec le client SSH de votre choix), une session Bash est lancée dans le conteneur sous le nom 'my-container'.

Pour plus de pointeurs et de documentation, voir: https://github.com/jeroenpeeters/docker-ssh

19
Jeroen Peeters

SSH dans un conteneur Docker en utilisant cette commande:

Sudo docker exec -i -t (container ID) bash
14
Tjs

Si vous êtes ici à la recherche d'une réponse spécifique à Docker Compose comme moi, elle fournit un moyen simple d'entrer sans avoir à rechercher l'ID de conteneur généré.

docker-compose exec prend le nom du service selon votre fichier docker-compose.yml.

Donc, pour obtenir un Bash Shell pour votre service Web, vous pouvez faire:

$ docker-compose exec web bash
14
bcmcfc

Si vous utilisez Docker sous Windows et souhaitez obtenir un accès Shell à un conteneur, utilisez ceci:

winpty docker exec -it <container_id> sh

Très probablement, vous avez déjà Git Bash installé. Si vous ne le faites pas, assurez-vous de l'installer.

11
Cosmin Ababei

Dans certains cas, votre image peut être alpine. Dans ce cas, il lancera:

Échec de l'exécution de l'exécution OCI: échec de l'exécution: conteneur_linux.go: 348: démarrage de le processus de conteneur a provoqué "exec: \" bash\": fichier exécutable introuvable dans $ PATH": inconnu

Parce que /bin/bash n'existe pas. Au lieu de cela, vous devriez utiliser:

docker exec -it 9f7d99aa6625 ash

ou

docker exec -it 9f7d99aa6625 sh
7
Deoxyseia

C'est simple !

Répertoriez toutes vos images Docker:

Sudo docker images

Sur mon système, il affiche la sortie suivante:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
bash                latest              922b9cc3ea5e        9 hours ago
14.03 MB
ubuntu              latest              7feff7652c69        5 weeks ago         81.15 MB

J'ai deux images Docker sur mon PC. Disons que je veux lancer le premier.

Sudo docker run -i -t ubuntu:latest /bin/bash

Cela vous donnera le contrôle terminal du conteneur. Vous pouvez maintenant effectuer tous les types d'opérations Shell à l'intérieur du conteneur. Comme si vous utilisiez ls, tous les dossiers de la racine du système de fichiers seront affichés.

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
6
Patel Sunil

GOINSIDE SOLUTION

installez l'outil de ligne de commande goinside avec:

Sudo npm install -g goinside

et entrez dans un conteneur de menu fixe avec une taille de terminal appropriée avec:

goinside docker_container_name

ancienne réponse

Nous avons mis cet extrait dans ~/.profile:

goinside(){
    docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside

Cela permet non seulement à tout le monde d'entrer dans un conteneur en cours d'exécution avec:

goinside containername

Cela résout également un problème de longue date concernant les tailles fixes des terminaux de conteneurs Docker . Ce qui est très énervant si vous y faites face.

De même, si vous suivez le lien , vous aurez également la commande terminée pour les noms de vos conteneurs Docker.

5
Soorena

Pour vous connecter à cmd dans un conteneur Windows, utilisez

docker exec -it d8c25fde2769 cmd

d8c25fde2769est l'identifiant du conteneur.

5
Aqeel Qureshi

Utilisez cette commande:

docker exec -it containerid /bin/bash
4
Admin Hack

Utilisation:

docker attach <container name/id here>

L’autre façon, même si elle présente un danger, consiste à utiliser attachname__, mais si vous Ctrl + C pour quitter la session, vous devez également arrêter le conteneur. Si vous voulez juste voir ce qui se passe, utilisez docker logs -f.

:~$ docker attach --help
Usage:  docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)
4
rbrooker

docker exec sera certainement une solution. Un moyen simple de traiter la question que vous avez posée consiste à monter le répertoire dans Docker dans le répertoire du système local .

Vous pouvez ainsi visualiser instantanément les modifications apportées au chemin local.

docker run -v /Users/<path>:/<container path> 
4
Pratik

Pour inspecter les fichiers, exécutez docker run -it <image> /bin/bash pour obtenir un terminal interactif. La liste des images peut être obtenue par docker images. Contrairement à docker exec, cette solution fonctionne également dans le cas où une image ne démarre pas (ou se ferme immédiatement après son exécution).

3
igo

Si Docker est installé avec Kitematic, vous pouvez utiliser l'interface graphique. Ouvrez Kitematic à partir de l'icône Docker et dans la fenêtre Kitematic, sélectionnez votre conteneur, puis cliquez sur l'icône exec.

Vous pouvez également voir le journal du conteneur et de nombreuses informations sur le conteneur (dans l'onglet Paramètres) dans cette interface graphique.

 Select Kitematic from menu

 Click on exec

3
Alireza Fattahi

Si le conteneur est déjà sorti (peut-être à cause d'une erreur), vous pouvez le faire

$ docker run --rm -it --entrypoint /bin/ash image_name

ou

$ docker run --rm -it --entrypoint /bin/sh image_name

ou

$ docker run --rm -it --entrypoint /bin/bash image_name

créer un nouveau conteneur et y insérer un shell. Puisque vous avez spécifié --rm, le conteneur sera supprimé lorsque vous quitterez le shell.

2
user674669

Dans mon cas, pour une ou plusieurs raisons, je dois vérifier toutes les informations relatives au réseau impliqué dans chaque conteneur. Donc, les commandes suivantes doivent être valides dans un conteneur ...

ip
route
netstat
ps
...

J'ai vérifié toutes ces réponses, aucune ne m'a été utile. J'ai recherché des informations sur d'autres sites. Je n’ajouterai pas de super lien ici, car il n’est pas écrit en anglais. Donc, je viens de mettre en ligne ce post avec une solution de synthèse pour les personnes qui ont les mêmes exigences que moi. 

Supposons que vous avez un conteneur en cours d'exécution nommé light-test. Suivez les étapes ci-dessous. 

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}}. Cette commande obtiendra une réponse semblable à /var/run/docker/netns/xxxx.
  • Puis ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx. Le répertoire peut ne pas exister, faites d'abord mkdir /var/run/netns.
  • Maintenant, vous pouvez exécuter ip netns exec xxxx ip addr show pour explorer le monde réseau dans un conteneur. 

PS. xxxx est toujours la même valeur reçue de la première commande. Et bien sûr, toutes les autres commandes sont valides, c'est-à-dire ip netns exec xxxx netstat -antp|grep 8080

1
Light.G

J'ai créé une fonction de terminal pour faciliter l'accès au terminal du conteneur. C'est peut-être utile pour vous aussi:

Le résultat est donc, au lieu de taper:

docker exec -it [container_id] /bin/bash

tu écriras:

dbash [container_id]

Mettez ce qui suit dans votre ~/.bash_profile (ou tout ce qui vous convient), puis ouvrez une nouvelle fenêtre de terminal et profitez du raccourci:

#usage: dbash [container_id]
dbash() {
    docker exec -it "$1" /bin/bash
}
1
Guy

vous pouvez interagir avec le terminal dans le conteneur Docker en passant l'option -ti

docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu

-t signifie terminal -i signifie interactif

1
Alwin

Si vous utilisez Docker Compose, cela vous mènera dans un conteneur Docker.

docker-compose run container_name /bin/bash

À l'intérieur du conteneur, vous serez dirigé vers WORKDIR défini dans le fichier Dockerfile. Vous pouvez changer votre répertoire de travail en

WORKDIR directory_path # E.g  /usr/src -> container's path
0
Sivakumar

Une autre option consiste à utiliser nsenter .

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
0
xuhdev

docker exec -it <Container-Id> /bin/bash 

Ou en fonction de la coquille, il peut être 

docker exec -it <Container-Id> /bin/sh

Vous pouvez obtenir la commande container-Id via docker ps

-i = interactif

-t = pour allouer un téléimprimeur

0
Ashutosh Chamoli