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

823

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

$ 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 

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

$ 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:/#

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

    
por Timur Fayzrakhmanov 01.08.2014 / 18:19

15 respostas

1207

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

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

Para o Docker versão 1.3 ou posterior: Obrigado ao usuário WiR3D que sugeriu outra maneira de obter o shell de um contêiner. Se usarmos attach , podemos usar apenas uma instância do shell. Então, 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:/#
    
por Timur Fayzrakhmanov 05.08.2014 / 08:01
601

Do Docker 1.3 em diante:

docker exec -it <containerIdOrName> bash

Basicamente, se o contêiner do Docker foi iniciado usando o comando /bin/bash , você pode acessá-lo usando attach . Se não, então você precisa executar o comando para criar uma instância Bash dentro do container usando exec .

Também para sair do Bash sem deixar o Bash sendo executado em um processo desonesto:

exit

Sim, é simples assim.

    
por WiR3D 29.10.2014 / 08:46
104

Embora o autor da pergunta tenha dito especificamente que está interessado em um contêiner em execução, também é importante notar que, se o contêiner não estiver em execução, mas você quiser executá-lo para pesquisar, será possível executar:

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

    
por Adam Kalnas 07.11.2014 / 19:46
26

Tente isto:

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

Fonte: link

    
por kraxor 01.08.2014 / 18:29
15

Com base na resposta de @ Timur, criei o seguinte script útil

Configuração

Coloque o arquivo docker-ssh no seu $PATH com o seguinte conteúdo

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

Observação : Alguns contêineres não contêm bash , mas ash , sh etc. Nesses casos, bash deve ser substituído no script acima.

Uso

Se você tiver uma instância em execução, basta executar

$> docker-ssh 

Caso contrário, forneça um parmeter ID id de docker obtido de docker ps (primeiro col)

$> docker-ssh 50m3r4nd0m1d
    
por Matyas 20.04.2016 / 13:39
8

Eu criei um servidor SSH em contêiner que fornece recursos de 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 dicas, confira o link

    
por Jeroen Peeters 03.10.2015 / 18:20
5

@jpetazzo tem uma postagem incrível sobre esse 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 esqueça de verificar a discussão nos comentários do post ...

Felicidades

    
por Richard 14.03.2015 / 11:12
5

Se o seu contêiner não tiver o bash instalado (por exemplo, consul), tente sh:

docker exec -it CONTAINER /bin/sh

Ou procure por shells em / bin primeiro:

docker export CONTAINER|tar -t|egrep ^bin/
    
por laktak 29.07.2015 / 15:40
3

Você também pode fornecer ao contêiner Docker um endereço IP roteirável com o Pipework e depois o 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 eventualmente tornará mais "portátil" em sistemas e versões.

    
por radriaanse 29.10.2014 / 12:58
2
docker run -it openjdk:8

Isso funciona: -)

    
por Kishan B 06.09.2016 / 17:11
2

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

UbuntuWithSSH-Docker

A essência do Dockerfile é link .

    
por Dev Khadka 26.08.2017 / 17:26
1

GOINSIDE

Instale a ferramenta de linha de comando goinside com:

sudo npm install -g goinside

e vá para dentro de um contêiner docker com um tamanho de terminal adequado com:

goinside docker_container_name

para mais detalhes, consulte esta .

    
por Soorena 13.08.2018 / 11:56
0

Para bash em um contêiner em execução, digite:

docker exec -t -i container_name /bin/bash
    
por Agustí Sánchez 11.10.2015 / 03:33
0

Apenas para informação. Se você precisar fazer o login em um container simples que não seja daemon, você precisa usar os seguintes comandos:

docker start {id}
docker attach {id}
    
por Nek 04.11.2015 / 22:05
-1

se o contêiner for interrompido como, por exemplo, um contêiner somente de dados, uma boa solução é executar um contêiner descartável toda vez que desejar anexar ao contêiner de dados. Nesse caso, o próprio contêiner de dados poderia estar totalmente vazio, já que o contêiner temporário teria as ferramentas do SO.

$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
    
por David Dehghan 14.10.2015 / 12:32