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

786

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)
$ [email protected]:/# 
However when I run the line above I get new CONTAINER ID
$ [email protected]:/#

J'ai utilisé Vagrant et j'aimerais avoir un comportement similaire à vagrant ssh .

    
posée Timur Fayzrakhmanov 01.08.2014 - 18:19
la source

15 réponses

1168

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
$ [email protected]:/#

Pour la version 1.3 ou ultérieure de Docker: Merci à l'utilisateur WiR3D qui a suggéré une autre façon d'obtenir le shell d'un conteneur. Si nous utilisons attach , nous ne pouvons 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 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
$ [email protected]:/#
    
réponse donnée Timur Fayzrakhmanov 05.08.2014 - 08:01
la source
576

À partir de Docker 1.3 et suivants:

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 attach . Sinon, vous devez exécuter la commande pour créer une instance de Bash dans le conteneur à l'aide de exec .

Quittez également Bash sans laisser Bash s'exécuter dans un processus malveillant:

exit

Ouais, c'est aussi simple que ça.

    
réponse donnée WiR3D 29.10.2014 - 08:46
la source
99

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 est également intéressant de noter que si le conteneur ne fonctionne pas, mais que vous souhaitez le lancer, vous pouvez le lancer:

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

    
réponse donnée Adam Kalnas 07.11.2014 - 19:46
la source
24

Essayez ceci:

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

Source: lien

    
réponse donnée kraxor 01.08.2014 - 18:29
la source
13

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

Configuration

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=

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 ces cas, bash doit être remplacé dans le script ci-dessus.

Utilisation

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

$> docker-ssh 

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

$> docker-ssh 50m3r4nd0m1d
    
réponse donnée Matyas 20.04.2016 - 13:39
la source
8

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 de 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 d’informations, consultez lien

    
réponse donnée Jeroen Peeters 03.10.2015 - 18:20
la source
5

@jpetazzo a un article 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 ...

Cheers

    
réponse donnée Richard 14.03.2015 - 11:12
la source
3

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

docker exec -it CONTAINER /bin/sh

Ou recherchez les shells dans / bin en premier:

docker export CONTAINER|tar -t|egrep ^bin/
    
réponse donnée laktak 29.07.2015 - 15:40
la source
3

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

Cela sera plus "traditionnel" (ssh), au lieu d’utiliser une commande spécifique à l’application telle que docker attach , et finira par la rendre plus "portable" entre les systèmes et les versions.

    
réponse donnée radriaanse 29.10.2014 - 12:58
la source
2
docker run -it openjdk:8

Cela fonctionne: -)

    
réponse donnée Kishan B 06.09.2016 - 17:11
la source
2

Parfois, il sera utile de pouvoir insérer ssh 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:

UbuntuWithSSH-Docker

L’essentiel du fichier Docker est le lien .

    
réponse donnée Dev Khadka 26.08.2017 - 17:26
la source
0

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

docker exec -t -i container_name /bin/bash
    
réponse donnée Agustí Sánchez 11.10.2015 - 03:33
la source
0

Juste pour information. Si vous devez vous connecter dans un conteneur simple autre qu'un démon, vous devez utiliser les commandes suivantes:

docker start {id}
docker attach {id}
    
réponse donnée Nek 04.11.2015 - 22:05
la source
0

GOINSIDE

installer l'outil de ligne de commande goinside avec:

sudo npm install -g goinside

et aller dans un conteneur Docker avec une taille de terminal correcte avec:

goinside docker_container_name

pour plus de détails, consultez ceci .

    
réponse donnée Soorena 13.08.2018 - 11:56
la source
-1

si le conteneur est arrêté comme par exemple un conteneur de données uniquement, une bonne solution consiste à exécuter un conteneur jetable à chaque fois que vous souhaitez vous connecter au conteneur de données. Dans ce cas, le conteneur de données lui-même pourrait être entièrement vide, car le conteneur temporaire aurait les outils du système d'exploitation.

$ docker run --rm --volumes-from mydata -it ubuntu bash
[email protected]:/# ls /mydata
[email protected]:/# touch /mydata/foo
[email protected]:/# exit
exit
    
réponse donnée David Dehghan 14.10.2015 - 12:32
la source

Lire d'autres questions sur les étiquettes