Comment entrer dans un conteneur Docker?

je commence à travailler avec Docker. J'utilise L'image de base WordPress et docker-composer.

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

615
demandé sur Peter Mortensen 2015-05-11 19:12:30

20 réponses

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 utilise un serveur web, par exemple, docker attach vous connectera probablement au stdout du processus du serveur web. Ça ne vous donnera pas nécessairement une coquille.

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. Par exemple:

docker exec -it <mycontainer> bash

bien sûr, quelle que soit la commande que vous exécutez, elle doit exister dans le système de fichiers 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 ; Lancez docker 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ée:

$ 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 courant:

$ docker exec -it d2d4a89aaee9 ip addr

de même, je pourrais démarrer une coque dans le conteneur;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
971
répondu larsks 2015-05-11 16:44:52

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

docker exec -t -i container_name /bin/bash
193
répondu Agustí Sánchez 2015-10-11 01:34:24

disons, pour des raisons qui vous sont propres, vous voulez vraiment utiliser SSH. Cela prend quelques mesures, mais cela peut être fait. Voici les commandes que vous exécutez l'intérieur du 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(,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 X11 en redirigeant vers le client SSH:

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

voici quelques ressources connexes:

60
répondu nobar 2018-08-05 13:16:07

Notice : cette réponse fait la promotion d'un outil que j'ai écrit.

j'ai créé un serveur SSH containerized 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 a Bash.

l'exemple suivant démarrerait un serveur SSH attaché à un conteneur avec le nom '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

quand vous connectez - vous à ce service SSH (avec votre client SSH de votre choix) une session Bash sera lancée dans le conteneur avec le nom "my-container".

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

16
répondu Jeroen Peeters 2017-05-25 19:19:09

SSH dans un conteneur Docker en utilisant cette commande:

sudo docker exec -i -t (container ID) bash
13
répondu Tjs 2017-05-25 19:19:28

si vous êtes ici à la recherche d'un docker Composez-réponse spécifique comme je l'étais, il fournit un moyen facile d'entrer sans avoir à chercher le conteneur ID généré.

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

donc pour obtenir un shell Bash pour votre service 'web', vous pouvez faire:

$ docker-compose exec web bash
11
répondu bcmcfc 2018-08-05 18:34:33

si vous utilisez Docker sur Windows et que vous voulez 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, veillez à l'installer.

9
répondu Cosmin Ababei 2017-02-09 09:04:32

pour se connecter au cmd dans un conteneur Windows, utilisez

docker exec -it d8c25fde2769 cmd

d8c25fde2769 est le numéro d'identification du conteneur.

5
répondu Aqeel Qureshi 2018-08-05 13:38:50

docker exec sera certainement une solution. Une façon facile de travailler avec la question que vous avez demandé est de montage du répertoire à L'intérieur de Docker dans le répertoire du système local .

pour que vous puissiez voir les changements dans le chemin local instantanément.

docker run -v /Users/<path>:/<container path> 
4
répondu Pratik 2017-05-25 19:17:53

Utiliser:

docker attach <container name/id here>

l'autre voie, bien qu'il y ait un danger pour elle, est d'utiliser attach , mais si vous Ctrl + C pour quitter la session, vous arrêterez également 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
répondu rbrooker 2018-08-05 13:34:48

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

BEC d'exécution exec a échoué: exec a échoué: container_linux.aller:348: départ processus de conteneur causé "exec: \" bash\": fichier exécutable non trouvé dans $PATH": inconnu

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

docker exec -it 9f7d99aa6625 ash

ou

docker exec -it 9f7d99aa6625 sh
4
répondu Deoxyseia 2018-08-05 18:51:29

pour inspecter les fichiers, Lancez 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 aussi dans le cas où une image ne démarre pas (ou cesse immédiatement après le démarrage).

3
répondu igo 2018-08-05 13:44:09

c'est simple !

Liste de toutes vos images Docker:

sudo docker images

sur mon système il a montré 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 courir le premier.

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

cela vous donnera le contrôle terminal du conteneur. Maintenant, vous pouvez effectuer tous les types d'opérations shell à l'intérieur du conteneur. Comme faire ls affichera tous les dossiers à la racine du système de fichiers.

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
3
répondu Patel Sunil 2018-08-05 18:54:01

si vous avez Docker 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 voir le journal des conteneurs et beaucoup d'informations sur les conteneurs (dans l'onglet Paramètres) dans cette interface graphique aussi.

Select Kitematic from menu

Click on exec

2
répondu Alireza Fattahi 2018-08-05 18:52:43

GOINSIDE SOLUTION

installer goinside outil en ligne de commande:

sudo npm install -g goinside

et aller à l'intérieur d'un conteneur docker avec une taille de terminal appropriée avec:

goinside docker_container_name

vieille réponse

nous avons mis cet extrait dans ~/.profile :

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

non seulement cela rend tout le monde en mesure d'entrer dans un contenant courant avec:

goinside containername

Elle résout également une longue durée de vie problème fixe sur le Panneau du terminal de conteneurs de tailles . Ce qui est très énervant si tu l'affrontes.

aussi si vous suivez le lien vous aurez la commande completion pour vos noms de conteneur docker aussi.

2
répondu Soorena 2018-08-13 09:58:06

utilisez cette commande:

docker exec -it containerid /bin/bash`
1
répondu Admin Hack 2018-08-05 18:54:18

une autre option est d'utiliser nsenter .

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
0
répondu xuhdev 2015-05-11 19:09:58

si vous utilisez Docker Composez alors cela vous conduira à l'intérieur d'un conteneur Docker.

docker-compose run container_name /bin/bash

à l'intérieur du conteneur il vous mènera à WORKDIR défini dans le fichier Dockerfile. Vous pouvez changer votre répertoire de travail par

WORKDIR directory_path # E.g  /usr/src -> container's path
0
répondu Sivakumar 2018-08-05 18:47:32

dans mon cas, pour certaines raisons, je dois vérifier toutes les informations réseau impliquées dans chaque conteneur. Donc les commandes suivantes doivent être valides dans le conteneur...

ip
route
netstat
ps
...

j'ai vérifié toutes ces réponses, aucune valide pour moi. J'ai recherché des informations dans d'autres sites web. Je n'ajouterai pas de super lien ici, puisqu'il n'est pas écrit en anglais. Donc je viens de mettre en place ce post avec une solution de résumé pour les gens qui ont la même exigence que moi.

Disons que vous avez un container courant appelé light-test. Suivez les étapes ci-dessous.

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}} . Cette commande obtiendra la réponse comme /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 du réseau en conteneur.

PS. xxxx est toujours la même valeur obtenue par la première commande. Et bien sûr, toutes les autres commandes sont valides, i.e. ip netns exec xxxx netstat -antp|grep 8080 .

0
répondu Light.G 2018-09-04 05:08:29

pour docker-composer (Docker4Drupal)

docker-compose exec php bash

j'utilise Docker pour Drupal sur un Linux ordinateur portable. Après avoir lancé le conteneur, j'utilise ' docker-compose exec php bash ' pour me connecter avec le conteneur afin de pouvoir exécuter des commandos drush. Il fonctionne très bien pour moi.

-3
répondu illutek 2018-08-05 13:41:43