Questão 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 de 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 eu quero pegar algo parecido com isto (entrar no container rodando):

$ 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.


797
2017-08-01 16:19


origem


alternativamente sudo docker exec -i -t 665b4a1e17b6 /bin/sh ser capaz de instalar programas e pacotes apt - fonjeekay


Respostas:


A resposta é de Docker attach comando. 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 Docker versão 1.3 ou posterior: graças ao usuário WiR3D que sugeriu outra maneira de obter uma concha de 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:/#

1181
2017-08-05 06:01



Alternativamente, execute sudo docker attach loving_heisenberg - thiagowfx
o comando attach não funciona para mim, faz com que a janela de encaixe congele ... alguma idéia de por que isso está acontecendo? - Mo J. Mughrabi
Um lembrete para os usuários do boot2docker: remova o sudo :) - Henno
-i -t é igual a -it - pasha.zhukov
Esta é uma resposta perigosa para ser selecionada e tão altamente votada. docker attachPor exemplo, para uma instância do MongoDB, a instância será eliminada. Como explicado em mais detalhes em essa questão  attach e exec são animais diferentes. - fwc


Do Docker 1.3 em diante:

docker exec -it <containerIdOrName> bash

Basicamente, se o contêiner do Docker foi iniciado usando o /bin/bash comando 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 rodando em um processo nocivo:

exit

Sim, é assim tão simples.


586
2017-10-29 07:46



Ainda não descobri como fazer o nano funcionar. Pensar que pode envolver docker-ssh de phusion - WiR3D
Existe alguma maneira de definir o bash por padrão em janelas de encaixe? - ipeacocks
@ ipeacocks sim, se o RUN comando no dockerfile é /bin/bash. Mas depende do que você quer dizer. Se você quer rodar o container e ter o bash disponível imediatamente naquele mesmo terminal, então rodando com -it deveria fazer isso - WiR3D
Usar o grupo do docker é uma prática ruim. Qualquer usuário que esteja no grupo de encaixe é essencialmente usado com permissões de raiz sem a necessidade de usar o sudo. projectatomic.io/blog/2015/08/… - Maiku Mori
Eu acho que não faz muita diferença, do ponto de vista de segurança do host, se você usa sudo vs docker grupo. De qualquer maneira, há uma falha de segurança embutida na janela de encaixe que pode fornecer privilégios totais no sistema de arquivos do host do convidado - independentemente de você usar o grupo de encaixe ou sudo para lançar o contêiner. - nobar


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 procurar, execute:

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


101
2017-11-07 18:46



Isso dá um container diferente, como a resposta do @kraxor. - Blaisorblade


Tente isto:

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

Fonte: https://docs.docker.com/articles/basics/#running-an-interactive-shell


24
2017-08-01 16:29



Não é adequado, porque recebo ID de CONTENTOR diferente (root@42f1e37bd0e5:/# e não root@665b4a1e17b6:/#) - Timur Fayzrakhmanov
link está morto, você deve atualizar - Ahmet Karakaya


Com base na resposta de @ Timur eu criei o seguinte roteiro acessível

Configuração

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 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

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

Uso

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

$> docker-ssh 

Caso contrário, fornecê-lo com um parmeter id docker que você recebe de docker ps (primeiro col)

$> docker-ssh 50m3r4nd0m1d

13
2018-04-20 11:39



Posso saber por que precisamos -l no final? - Nam G VU
para iniciar o bash como um shell de login, lendo os parâmetros do ambiente (descritos na linha acima do comando) - Matyas


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 dicas, confira https://github.com/jeroenpeeters/docker-ssh


8
2017-10-03 16:20



Esta deveria ser a resposta aceita - Nam G VU
A propósito, como podemos ter o .bashrc carregado automaticamente ao iniciar uma sessão ssh usando sua solução? Também postou um problema no github github.com/jeroenpeeters/docker-ssh/issues/30 - Nam G VU


@jpetazzo tem um post 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 esqueça de conferir a discussão nos comentários do post ...

Felicidades


5
2018-03-14 10:12



Esse é um post bastante antigo que não é mais realmente necessário. @ WiR3D's docker exec solução é bastante mais conveniente. - drevicko


Se o seu container não tiver o bash instalado (por exemplo, consul), você pode tentar sh:

docker exec -it CONTAINER /bin/sh

Ou procure por shells em / bin primeiro:

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

3
2017-07-29 13:40



O que é "cônsul"? Você tem uma referência para isso? Você quer dizer "console"? - Peter Mortensen