Cómo obtener bash o ssh en un contenedor en ejecución en modo de fondo?

Quiero ssh o bash en un contenedor docker en ejecución. Por favor, vea el ejemplo:

$ 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 

Ahora quiero obtener algo como esto (ir al contenedor en ejecución):

$ sudo docker run -t -i webserver (o tal vez 665b4a1e17b6 en su lugar)
$ root@665b4a1e17b6:/#

Sin embargo, cuando ejecuto la línea de arriba, obtengo una nueva IDENTIFICACIÓN de CONTENEDOR:

$ root@42f1e37bd0e5:/#

Usé Vagrant y me gustaría obtener un comportamiento similar al de vagrant ssh.

La respuesta es Docker attach comando. Entonces, para mi ejemplo anterior, la solución será:

$ sudo docker attach 665b4a1e17b6 #by IDor$ sudo docker attach loving_heisenberg #by Name$ root@665b4a1e17b6:/#

Para Docker versión 1.3 o posterior: Gracias al usuario WiR3D quién sugirió otra forma de obtener la cáscara de un contenedor. Si usamos attach podemos usar solo una instancia del shell. Entonces, si queremos abrir una nueva terminal con una nueva instancia del shell de un contenedor, solo necesitamos ejecutar lo siguiente:

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

o

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

A partir de Docker 1.3:

docker exec -it <containerIdOrName> bash

Básicamente, si el contenedor Docker se inició utilizando el /bin/bash comando al que puede acceder usando attach. De lo contrario, debe ejecutar el comando para crear una instancia de Bash dentro del contenedor usando exec.

También para salir de Bash sin dejar Bash ejecutándose en un proceso deshonesto:

exit

Sí, es así de simple.

Aunque el autor de la pregunta dijo específicamente que están interesados en un contenedor en ejecución, también vale la pena señalar que si el contenedor no se está ejecutando, pero le gustaría ejecutarlo para hurgar, puede ejecutar:

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

Prueba esto:

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

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

Basado en la respuesta de @Timur, he creado lo siguiente guión práctico

Configuración

Poner docker-ssh archiva en tu $PATH con los siguientes contenidos

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

Nota: Algunos contenedores no contienen bash, pero ash, sh sucesivamente. En estos casos bash se sustituye en el guion anterior.

Uso

Si solo tiene una instancia en ejecución, simplemente ejecute

$> docker-ssh 

De lo contrario, proporciónele un parámetro docker id que obtenga de docker ps (primera col)

$> docker-ssh 50m3r4nd0m1d

Si su contenedor no tiene instalado bash, puede probar sh:

docker exec -it CONTAINER /bin/sh

O busque primero los shells en / bin:

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

He creado un servidor SSH en contenedores que proporciona capacidades SSH a cualquier contenedor en ejecución. No es necesario cambiar el recipiente. El único requisito es que el contenedor tenga bash.

Si tiene un contenedor con el nombre 'web-server1'. El siguiente comando docker run iniciaría un segundo contenedor que proporcionaría SSH para el primer contenedor.

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

Para más consejos, echa un vistazo https://github.com/jeroenpeeters/docker-ssh

@jpetazzo tiene un impresionante post sobre este tema. La respuesta corta sería usar nsenter:

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)nsenter --target $PID --mount --uts --ipc --net --pid

PD: No olvides revisar la discusión en los comentarios de la publicación...

Aclamaciones

También puede dar al contenedor de Docker una dirección IP enrutable con canalización y, a continuación, SSH en la máquina con esa nueva dirección IP.

Esto será más "tradicional" (ssh), en lugar de usar un comando específico de la aplicación como docker attach, y eventualmente lo hará más "portátil" en todos los sistemas y versiones.

A veces será útil poder ssh en un contenedor Docker, especialmente durante el desarrollo. La siguiente imagen de Docker permite ssh en un contenedor usando una clave privada:

UbuntuWithSSH-Ventana acoplable

La esencia del Dockerfile es https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.

Tenga en cuenta que usar SSH para bash en el contenedor en ejecución es una mala práctica; consulte justificación aquí. `sudo docker exec - i-t container-name / bin / bash ’ es un camino a seguir.

alternativamente, sudo docker exec - i-t 665b4a1e17b6 / bin sh ’ para poder instalar programas y paquetes apt