970 votes

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

Je veux m'introduire par ssh ou bash dans un conteneur docker en cours d'exécution. Veuillez voir l'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 ceci (aller dans le conteneur en cours d'exécution) :

$ sudo docker run -t -i webserver (ou peut-être 665b4a1e17b6 à la place)
$ root@665b4a1e17b6:/#

Cependant, lorsque j'exécute la ligne ci-dessus, j'obtiens un nouveau CONTAINER ID :

$ root@42f1e37bd0e5:/#

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

1348voto

T4NK3R Points 962

La réponse est l'outil de Docker attach commandement. 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 le Shell d'un conteneur. Si nous utilisons attach nous ne pouvons utiliser qu'une seule instance du Shell. Ainsi, si nous voulons ouvrir un nouveau terminal avec une nouvelle instance du Shell d'un conteneur, il nous 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:/#

706voto

WiR3D Points 7220

À partir de Docker 1.3 :

docker exec -it <containerIdOrName> bash

En fait, si le conteneur Docker a été démarré à l'aide de la commande /bin/bash vous pouvez y accéder en utilisant attach . Si ce n'est pas le cas, vous devez exécuter la commande pour créer une instance Bash à l'intérieur du conteneur en utilisant exec .

Permet également de quitter Bash sans laisser Bash s'exécuter dans un processus rebelle :

exit

Oui, c'est aussi simple que ça.

129voto

Adam Kalnas Points 1391

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, mais que vous souhaitez le lancer pour vous balader, vous pouvez le faire :

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

29voto

kraxor Points 5239

Essayez ça :

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

Source : https://docs.docker.com/engine/reference/commandline/run/

20voto

Matyas Points 526

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

Configuration

Mettez docker-ssh dans votre $PATH avec les contenus suivants

#!/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

Note : 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 n'avez qu'une seule instance en fonctionnement, il suffit d'exécuter

$> docker-ssh 

Sinon, fournissez-lui un paramètre d'identification de docker que vous obtenez à partir de docker ps (premier col)

$> docker-ssh 50m3r4nd0m1d

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X