web-dev-qa-db-fra.com

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

Je veux SSH ou bash dans un conteneur de 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 (allez 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 j'aimerais avoir un comportement similaire à vagrant ssh.

905

La réponse est la commande attach de Docker. 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 de WiR3D qui a suggéré un autre moyen d'obtenir le shell d'un conteneur. Si nous utilisons attach, nous ne pourrons utiliser qu'une seule instance du shell. Donc, si nous voulons ouvrir un nouveau terminal avec une nouvelle instance du shell d'un conteneur, il nous suffit d'exécuter les tâches suivantes:

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

ou

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

À partir de Docker 1.3:

docker exec -it <containerIdOrName> bash

En gros, si le conteneur Docker a été démarré à l'aide de la commande /bin/bash, vous pouvez y accéder à l'aide de attachname__. Sinon, vous devez exécuter la commande pour créer une instance Bash dans le conteneur à l'aide de execname__.

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

exit

Oui, c'est aussi simple que cela.

656
WiR3D

Bien que l'auteur de la question ait spécifiquement indiqué qu'il était intéressé par un conteneur en cours d'exécution, il convient également de noter que si le conteneur n'est pas en cours d'exécution, vous souhaitez toutefois l'exécuter pour fouiller dans tous les sens:

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

119
Adam Kalnas

Essaye ça:

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

Source: https://docs.docker.com/articles/basics/#running-an-interactive-Shell

27
kraxor

Sur la base de la réponse de @ Timur, j'ai créé le texte suivant script pratique

Installer

Mettez le fichier docker-ssh 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 conteneurs ne contiennent pas bash, mais ash, sh etc. Dans ce cas, bash sera remplacé dans le script ci-dessus.

Usage

Si vous n'avez qu'une seule instance en cours d'exécution, lancez simplement

$> docker-ssh 

Sinon, fournissez-lui un paramètre d'identifiant de menu fixe que vous obtenez de docker ps (first col)

$> docker-ssh 50m3r4nd0m1d
17
Matyas

Si votre conteneur n'est pas installé sur bash, vous pouvez essayer sh:

docker exec -it CONTAINER /bin/sh

Ou cherchez d'abord les coquillages dans/bin:

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

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 suivante de docker run démarrera un deuxième conteneur qui fournirait 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, allez à la caisse https://github.com/jeroenpeeters/docker-ssh

9
Jeroen Peeters

@jpetazzo a un post génial à 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 de l'article ...

À votre santé

6
Richard

Vous pouvez également attribuer au conteneur Docker une adresse IP routable avec Pipework, puis SSH dans la machine avec cette nouvelle adresse IP.

Ce sera plus "traditionnel" (ssh), au lieu d'utiliser une commande spécifique à l'application telle que docker attach, et le rendra éventuellement plus "portable" entre systèmes et versions.

4
radriaanse

Parfois, il sera utile de pouvoir insérer un conteneur Docker dans un conteneur Docker, en particulier pendant le développement. L'image Docker suivante permet de ssh dans un conteneur en utilisant une clé privée:

buntuWithSSH-Docker

L'essentiel du fichier de docker est https://Gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 .

2
Dev Khadka
docker run -it openjdk:8

Cela marche :-)

2
Kishan B

ALLER À L'INTÉRIEUR

installez l'outil goinside en ligne de commande 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

pour plus de détails, consultez this out.

1
Soorena

Juste pour informations. Si vous devez vous connecter à un conteneur simple qui n'est pas un démon, vous devez utiliser les commandes suivantes:

docker start {id}
docker attach {id}
0
Nek

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

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