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
.
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:/#
À 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 attach
name__. Sinon, vous devez exécuter la commande pour créer une instance Bash dans le conteneur à l'aide de exec
name__.
Également pour quitter Bash sans laisser Bash s'exécuter dans un processus non autorisé:
exit
Oui, c'est aussi simple que cela.
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>
Essaye ça:
Sudo docker run -i -t webserver /bin/bash
Source: https://docs.docker.com/articles/basics/#running-an-interactive-Shell
Sur la base de la réponse de @ Timur, j'ai créé le texte suivant script pratique
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.
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
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/
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
@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é
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.
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:
L'essentiel du fichier de docker est https://Gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 .
docker run -it openjdk:8
Cela marche :-)
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.
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}
Pour bash dans un conteneur en cours d'exécution, tapez ceci:
docker exec -t -i container_name /bin/bash