Eu quero ssh ou bash em um contêiner 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 obter algo assim (vá para o contêiner em execução):
$ sudo docker run -t -i webserver
(ou talvez 665b4a1e17b6
em vez disso)
$ root@665b4a1e17b6:/#
No entanto, quando executo a linha acima, recebo um novo CONTAINER ID:
$ root@42f1e37bd0e5:/#
Eu usei o Vagrant e gostaria de obter um comportamento semelhante ao vagrant ssh
.
A resposta é o
attach
comando do Docker. Então, para o meu exemplo acima, a solução será:Para a versão 1.3 ou posterior do Docker: 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. Portanto, se quisermos abrir um novo terminal com uma nova instância do shell de um contêiner, basta executar o seguinte:ou
Do Docker 1.3 em diante:
Basicamente, se o contêiner do Docker foi iniciado usando o
/bin/bash
comando, você pode acessá-lo usandoattach
. Caso contrário, você precisará executar o comando para criar uma instância Bash dentro do contêiner usandoexec
.Também para sair do Bash sem deixar o Bash rodando em um processo não autorizado:
Sim, é tão simples.
Embora o autor da pergunta tenha dito especificamente que está interessado 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>
Tente isto:
Fonte: https://docs.docker.com/engine/reference/commandline/run/
Com base na resposta de @Timur, criei o seguinte script útil
Configurar
Coloque
docker-ssh
o arquivo no seu$PATH
com o seguinte conteúdoNota : Alguns containers não contêm
bash
, masash
,sh
etc. Nestes casosbash
devem ser substituídos no script acima.Uso
Se você tiver apenas uma instância em execução, basta executar
Caso contrário, forneça um parâmetro de identificação do docker que você obtém de
docker ps
(primeira coluna)Se o seu contêiner não tiver o bash instalado, você pode tentar sh:
Ou procure por shells em /bin primeiro:
Eu criei um servidor SSH em contêiner que fornece recursos SSH para qualquer contêiner em execução. Você não precisa alterar seu contêiner. O único requisito é que o container tenha bash.
Se você tiver um contêiner com o nome 'web-server1'. O comando docker run a seguir iniciaria um segundo contêiner que forneceria SSH para o primeiro contêiner.
Para mais dicas, confira https://github.com/jeroenpeeters/docker-ssh
@jpetazzo tem um post incrível sobre esse assunto . A resposta curta seria usar
nsenter
:PS: Não esqueçam de conferir a discussão nos comentários do post...
Felicidades
Você também pode fornecer ao contêiner do Docker um endereço IP roteável com o 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 eventualmente o tornará mais "portátil" entre sistemas e versões.Às vezes, será útil poder ssh em um contêiner do Docker, especialmente durante o desenvolvimento. A seguinte imagem do Docker permite ssh em um contêiner usando uma chave privada:
UbuntuWithSSH-Docker
A essência do Dockerfile é https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 .