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

Je veux ssh ou bash dans un conteneur docker en cours d'exécution. Veuillez voir l'exemple:

$ sudo docker run -d webserverwebserver is clean image from ubuntu:14.04$ sudo docker psCONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES665b4a1e17b6  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 (ou peut-être 665b4a1e17b6 plutôt)
$ root@665b4a1e17b6:/#

Cependant, lorsque j'exécute la ligne ci-dessus, j'obtiens un nouvel ID DE CONTENEUR:

$ root@42f1e37bd0e5:/#

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

La réponse est celle de Docker attach commande. Donc pour mon exemple ci-dessus, la solution sera:

$ sudo docker attach 665b4a1e17b6 #by IDor$ 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 la coquille 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 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:/#

À partir de Docker 1.3:

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 à l'intérieur du conteneur en utilisant exec.

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

exit

Oui, c'est aussi simple que cela.

Bien que l'auteur de la question ait spécifiquement déclaré 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 l'exécuter pour fouiller, vous pouvez exécuter:

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

Essayez ceci:

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

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

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

Configuration

Mettre docker-ssh fichier dans votre $PATH avec le contenu suivant

#!/bin/bash -xe# docker container id or name might be given as a parameterCONTAINER=$1if [[ "$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-là bash sera remplacé dans le script ci-dessus.

Utilisation

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

$> docker-ssh 

Sinon, fournissez - lui un paramètre docker id que vous obtenez à partir de docker ps (première col)

$> docker-ssh 50m3r4nd0m1d

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

docker exec -it CONTAINER /bin/sh

Ou cherchez d'abord les coquilles 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 docker run suivante démarrerait 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 conseils, passez à la caisse https://github.com/jeroenpeeters/docker-ssh

@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 consulter la discussion dans les commentaires du post...

Acclamation

Vous pouvez également donner 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 comme docker attach, et finira par le rendre plus "portable" sur tous les systèmes et versions.

Parfois, il sera pratique de pouvoir ssh dans un conteneur Docker, en particulier pendant le développement. L'image Docker suivante permet de ssh dans un conteneur à l'aide d'une clé privée:

UbuntuWithSSH-Docker

L'essentiel du Dockerfile est https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.

Notez que l’utilisation de SSH pour bash dans un conteneur en cours d’exécution est une mauvaise pratique-voir justification ici. `sudo docker exec-i-t container-name / bin / bash ’ est une solution.

alternativement ‘sudo docker exec-i-t 665b4a1e17b6 / bin` sh’ pour pouvoir installer les programmes et paquets apt