Como obter bash ou ssh em um contêiner em execução no modo de fundo?

Eu quero ssh ou bash em um contêiner Docker em execução. Por favor, veja o exemplo:

$ 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 

Agora eu quero obter algo assim (vá para o contêiner em execução):

$ sudo docker run -t -i webserver (ou talvez 665b4a1e17b6 Sim)
$ root@665b4a1e17b6:/#

No entanto, quando executo a linha acima, recebo um novo ID de contêiner:

$ root@42f1e37bd0e5:/#

Eu usei o Vagrant e gostaria de obter um comportamento semelhante ao vagrant ssh.

A resposta é do Docker attach comando. Então, para o meu exemplo acima, a solução será:

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

Para Docker versão 1.3 ou posterior: graças ao usuário WiR3D quem sugeriu outra maneira de obter o shell de um contêiner. Se usarmos attach podemos usar apenas uma instância do shell. Portanto, se quisermos abrir um novo terminal com uma nova instância do shell de um contêiner, só precisamos executar o seguinte:

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

ou

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

Do Docker 1.3 em diante:

docker exec -it <containerIdOrName> bash

Basicamente, se o contêiner Docker foi iniciado usando o /bin/bash comando você pode acessá-lo usando attach. Caso contrário, você precisará executar o comando para criar uma instância Bash dentro do contêiner usando exec.

Também para sair do Bash sem deixar o Bash em execução em um processo desonesto:

exit

Sim, é tão simples assim.

Embora o autor da pergunta tenha dito especificamente que eles estão interessados em um contêiner em execução, também vale a pena notar que, se o contêiner não estiver em execução, mas você gostaria de executá-lo para bisbilhotar, você pode executar:

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

Experimentar:

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

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

Com base na resposta de @Timur, criei o seguinte script prático

Configuracao

Colocar docker-ssh arquivo em seu $PATH com o seguinte conteúdo

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

Notar: Algum recipiente não contém bash, mas ash, sh etc. Nestes casos bash deve ser substituído no script acima.

Uso

Se você tiver apenas uma instância em execução, simplesmente execute

$> docker-ssh 

Caso contrário, forneça a ele um parâmetro docker id do qual você obtém docker ps (primeiro col)

$> docker-ssh 50m3r4nd0m1d

Se o seu contêiner não tiver o bash instalado, você pode tentar sh:

docker exec -it CONTAINER /bin/sh

Ou procure conchas em / bin primeiro:

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

Eu criei um servidor SSH em contêiner que fornece recursos SSH para qualquer contêiner em execução. Você não precisa mudar seu contêiner. O único requisito é que o contêiner tenha bash.

Se você tiver um contêiner com o nome 'Web-server1'. O seguinte comando docker run iniciaria um segundo contêiner que forneceria SSH para o primeiro contêiner.

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 mais ponteiros, checkout https://github.com/jeroenpeeters/docker-ssh

@ jpetazzo tem um postagem incrível sobre este assunto. A resposta curta seria usar nsenter:

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

P. s.: Não se esqueça de verificar a discussão nos comentários da postagem...

Aplauso

Você também pode fornecer ao contêiner do Docker um endereço IP roteável com Pipework e, depois disso, SSH na máquina com esse novo endereço IP.

Isso será mais" tradicional " (ssh), em vez de usar um comando específico do aplicativo como docker attach, e acabará por torná-lo mais' portátil ' em sistemas e versões.

Às vezes, será útil poder ssh em um contêiner Docker, especialmente durante o desenvolvimento. A imagem do Docker a seguir permite ssh em um contêiner usando uma chave privada:

UbuntuWithSSH-Docker

A essência do Dockerfile é https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.

Observe que usar SSH para bash no contêiner em execução é uma prática ruim-consulte justificativa aqui. ‘sudo docker exec-i-t container-name / bin / bash’ é um caminho a percorrer.

alternativamente ‘sudo docker exec-i-t 665b4a1e17b6/bin / sh’ para poder instalar programas e pacotes apt