Question Comment obtenir bash ou ssh dans un conteneur en cours d'exécution en mode d'arrière-plan?


Je veux ssh ou bash dans un conteneur docker en cours d'exécution. S'il vous plaît, voir exemple:

$ sudo docker run -d webserver
webserver is clean image from ubuntu:14.04
$ sudo docker ps
CONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES
665b4a1e17b6  webserver:latest /bin/bash  ...     ...     22/tcp, 80/tcp loving_heisenberg 

maintenant je veux obtenir quelque chose comme ça (aller dans le conteneur en cours d'exécution):

$ sudo docker run -t -i webserver (or maybe 665b4a1e17b6 instead)
$ root@665b4a1e17b6:/# 
However when I run the line above I get new CONTAINER ID
$ root@42f1e37bd0e5:/#

J'ai utilisé Vagrant et je voudrais avoir un comportement similaire à celui vagrant ssh.


795
2017-08-01 16:19


origine


alternativement sudo docker exec -i -t 665b4a1e17b6 /bin/sh pouvoir installer des programmes et des paquets apt - fonjeekay


Réponses:


La réponse est Docker's attach commander. Donc, pour mon exemple ci-dessus, la solution sera:

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

Pour Docker version 1.3 ou ultérieure: Merci à l'utilisateur WiR3D qui a suggéré une autre façon d'obtenir un shell de conteneur. Si nous utilisons attach nous ne pouvons utiliser qu'une seule instance du shell. Donc, si vous voulez ouvrir un nouveau terminal avec une nouvelle instance du shell d'un conteneur, il suffit d'exécuter ce qui suit:

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

ou

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#

1178
2017-08-05 06:01



Alternativement, exécutez sudo docker attach loving_heisenberg - thiagowfx
la commande attach ne fonctionne pas pour moi, cela provoque le blocage du docker .. des idées pourquoi cela se produit? - Mo J. Mughrabi
Un rappel pour les utilisateurs de boot2docker: supprimer sudo :) - Henno
-i -t équivaut à -it - pasha.zhukov
C'est une réponse dangereuse à choisir et à voter si fortement. docker attachpar exemple, une instance de MongoDB va tuer l'instance. Comme expliqué plus en détail dans cette question  attach et exec sont des animaux différents. - fwc


À partir de Docker 1.3 et suivants:

docker exec -it <containerIdOrName> bash

Fondamentalement, si le conteneur Docker a été démarré en utilisant le /bin/bash commande vous pouvez y accéder en utilisant attach. Sinon, vous devez exécuter la commande pour créer une instance Bash dans le conteneur en utilisant exec.

Aussi pour quitter Bash sans laisser Bash s'exécuter dans un processus non autorisé:

exit

Ouais, c'est aussi simple que ça.


585
2017-10-29 07:46



toujours pas compris comment faire nano pour travailler. Pensez que cela peut impliquer docker-ssh de phusion - WiR3D
Est-il possible de définir bash par défaut dans les dockers? - ipeacocks
@ipeacocks oui, si le RUN la commande dans le fichier docker est /bin/bash. Mais cela dépend de ce que tu veux dire. Si vous voulez exécuter le conteneur et que Bash est disponible immédiatement dans ce même terminal, alors vous exécuterez avec -it devrait le faire - WiR3D
Utiliser Docker Group est une mauvaise pratique. Tout utilisateur qui est dans le groupe docker est essentiellement utilisé avec les autorisations root sans avoir besoin d'utiliser sudo. projectatomic.io/blog/2015/08/… - Maiku Mori
Je pense que cela ne fait pas beaucoup de différence, du point de vue de la sécurité de l’hôte, que vous utilisiez sudo contre docker groupe. Dans les deux cas, il existe un trou de sécurité intégré dans docker qui peut fournir des privilèges complets dans le système de fichiers hôte à partir de l'invité, que vous utilisiez le groupe Docker ou non. sudo pour lancer le conteneur. - nobar


Bien que l'auteur de la question ait spécifiquement déclaré être intéressé par un conteneur en cours d'exécution, il est également intéressant de noter que si le conteneur n'est pas en cours d'exécution, mais que vous souhaitez l'exécuter, vous pouvez exécuter:

docker run -i -t --entrypoint /bin/bash <imageID>


101
2017-11-07 18:46



Cela donne un conteneur différent, tout comme la réponse de @kraxor. - Blaisorblade


Essaye ça:

sudo docker run -i -t webserver /bin/bash

La source: https://docs.docker.com/articles/basics/#running-an-interactive-shell


24
2017-08-01 16:29



Ce n'est pas approprié, car je reçois un ID de CONTENEUR différent (root@42f1e37bd0e5:/# et pas root@665b4a1e17b6:/#) - Timur Fayzrakhmanov
le lien est mort, vous devriez mettre à jour - Ahmet Karakaya


Basé sur la réponse de @ Timur, j'ai créé ce qui suit script pratique

Installer

Mettre docker-ssh déposer dans votre $PATH avec le contenu suivant

#!/bin/bash -xe

# docker container id or name might be given as a parameter
CONTAINER=$1

if [[ "$CONTAINER" == "" ]]; then
  # if no id given simply just connect to the first running container
  CONTAINER=$(docker ps | grep -Eo "^[0-9a-z]{8,}\b")
fi

# start an interactive bash inside the container
# note some containers don't have bash, then try: ash (alpine), or simply sh
# the -l at the end stands for login shell that reads profile files (read man)
docker exec -i -t $CONTAINER bash -l

Remarque: Certains contenants ne contiennent pas bash, mais ash, sh etc. Dans ces cas bash doit être remplacé dans le script ci-dessus.

Usage

Si vous avez une instance en cours d'exécution, exécutez simplement

$> docker-ssh 

Sinon, fournissez-lui un identifiant de docker id que vous obtenez de docker ps (premier col)

$> docker-ssh 50m3r4nd0m1d

13
2018-04-20 11:39



Puis-je savoir pourquoi nous avons besoin de -l à la fin? - Nam G VU
pour démarrer bash comme shell de connexion, en lisant les paramètres d'environnement (décrits dans la ligne au-dessus de la commande) - Matyas


J'ai créé un serveur SSH conteneurisé qui fournit des fonctionnalités SSH à tout conteneur en cours d'exécution. Vous n'avez pas besoin de changer votre conteneur. La seule exigence est que le conteneur ait bash.

Si vous avez un conteneur avec le nom 'web-server1'. La commande d'exécution docker suivante démarrera un deuxième conteneur qui fournira SSH pour le premier conteneur.

docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \
jeroenpeeters/docker-ssh

Pour plus de pointeurs, checkout https://github.com/jeroenpeeters/docker-ssh


8
2017-10-03 16:20



Cela devrait être la réponse acceptée ^ - Nam G VU
Au fait, comment peut-on charger automatiquement .bashrc au démarrage d'une session ssh en utilisant votre solution? Également publié un problème sur github github.com/jeroenpeeters/docker-ssh/issues/30 - Nam G VU


@jpetazzo a un poste génial sur ce sujet. La réponse courte serait d'utiliser nsenter:

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

P.S .: N'oubliez pas de vérifier la discussion dans les commentaires du post ...

À votre santé


5
2018-03-14 10:12



C'est un message plutôt vieux que n'est plus vraiment nécessaire. @ WiR3D's docker exec la solution est plutôt plus pratique. - drevicko


Si votre conteneur n'a pas installé bash (par exemple, consul), vous pouvez essayer sh:

docker exec -it CONTAINER /bin/sh

Ou cherchez d'abord des obus dans / bin:

docker export CONTAINER|tar -t|egrep ^bin/

3
2017-07-29 13:40



Quel est "consul"? Avez-vous une référence pour cela? Tu veux dire "console"? - Peter Mortensen