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.
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
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:
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:
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)
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.
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:
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.