Eu quero ssh ou bash em um contêiner de docker em execução. Por favor, veja o exemplo:
agora eu quero obter algo assim (vá para o contêiner em execução):
Eu usei o Vagrant e gostaria de ter um comportamento semelhante ao vagrant ssh.
alternativamente, sudo docker exec -i -t 665b4a1e17b6 /bin/shpara ser capaz de instalar programas apt e pacotes
Observe que usar o SSH para bater em contêiner em execução é uma prática ruim - veja a justificativa aqui . sudo docker exec -i -t container-name /bin/bashé um caminho a percorrer.
— patryk.beza 22/03
A resposta é o attachcomando do Docker . Portanto, para o meu exemplo acima, a solução será:
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. Portanto, se queremos abrir um novo terminal com uma nova instância do shell de um contêiner, precisamos apenas executar o seguinte:
Como alternativa, executesudo docker attach loving_heisenberg
o comando attach não funciona para mim, faz com que a janela de encaixe congele .. alguma idéia de por que está acontecendo?
Um lembrete para os usuários do boot2docker: remove sudo :)
-i -té igual a-it
Esta é uma resposta perigosa a ser selecionada e muito votada. docker attachA instalação em uma instância do MongoDB, por exemplo, matará a instância. Como explicado em mais detalhes nesta pergunta attach e execsão animais diferentes.
— fwc 10/05/19
Basicamente, se o recipiente Docker foi iniciado usando o /bin/bashcomando que você pode acessá-lo usando attach. Caso contrário, será necessário executar o comando para criar uma instância do Bash dentro do contêiner usando exec.
Também para sair do Bash sem deixá-lo em execução em um processo não autorizado:
Ainda não descobrimos como fazer o nano funcionar. Acha que pode envolver a janela de encaixe-ssh a partir phusion
Existe alguma maneira de definir o bash por padrão nas janelas de encaixe?
@ipeacocks sim, se o RUNcomando no dockerfile for /bin/bash. Mas depende do que você quer dizer. Se você deseja executar o recipiente e têm o bash disponível imediatamente naquele mesmo terminal, em seguida, correr com -itdeve fazê-lo
Usar o grupo de encaixe é uma prática recomendada. Qualquer usuário que esteja no grupo de janelas de encaixe é essencialmente usado com permissões de root, sem a necessidade de usar o sudo. projectatomic.io/blog/2015/08/…
— Maiku Mori 7/16
Eu acho que não faz muita diferença, do ponto de vista da segurança do host, se você usa o sudovs dockergroup. De qualquer forma, existe uma falha de segurança incorporada à janela de encaixe que pode fornecer privilégios completos no sistema de arquivos host do convidado - independentemente de você usar o grupo de janela de encaixe ou sudopara iniciar o contêiner.
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ê deseja executá-lo para bisbilhotar, é possível executar:
Isso fornece um contêiner diferente, assim como a resposta do @ kraxor.
Fonte: https://docs.docker.com/articles/basics/#running-an-interactive-shell
Não é adequado, porque eu recebo diferente ID CONTAINER ( root@42f1e37bd0e5:/#e não root@665b4a1e17b6:/#)
link está morto, você deve atualizar
— Ahmet Karakaya 15/04
Coloque o docker-ssharquivo no seu $PATHcom o seguinte conteúdo
Nota : Alguns contêineres não contêm bash, mas ash, shetc. Nestes casos, bashdevem ser substituídos no script acima.
Se você tiver apenas uma instância em execução, basta executar
Caso contrário, forneça a ele um parâmetro de ID do docker que você obtém docker ps(primeira coluna)
Posso saber por que precisamos de -l no final?
para começar a festa como um shell de login, lendo os parâmetros de ambiente (descrito na linha acima do comando)
Se o seu contêiner não tiver o bash instalado, você pode tentar sh:
Ou procure conchas em / bin primeiro:
O que é "cônsul" ? Você tem uma referência para isso? Você quer dizer "console" ?
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 uma festança.
Para obter mais dicas, consulte https://github.com/jeroenpeeters/docker-ssh
Esta deve ser a resposta aceita ^
A propósito, como podemos carregar o .bashrc 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
@jpetazzo tem uma publicação incrível sobre esse assunto . A resposta curta seria usar nsenter:
PS: Não se esqueça de conferir a discussão nos comentários do post ...
Esse é um post bastante antigo que não é mais realmente necessário . A docker execsolução do @ WiR3D é bastante mais conveniente.
Você também pode fornecer ao contêiner do Docker um endereço IP roteável com o Pipework e, depois disso, colocar o SSH na máquina com esse novo endereço IP.
Este 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 todos os sistemas e versões.
Por favor, adicione a maneira simples de como fazê-lo. Para ser sincero, eu realmente preciso, mas não tenho tempo para procurar a solução mais simples para isso. Você poderia postar sua resposta aqui? Seria ótimo ..
— Timur Fayzrakhmanov 29/10
Existem duas maneiras de conseguir isso, mas não é simples e se tornaria um grande post. Você pode verificar esse link por conta própria, para usar a tubulação ou esse link , o que basicamente faz o mesmo que o Pipework e é um pouco mais simples, mas você precisa fazê-lo manualmente. Portanto, depende de quantos servidores você está falando. Se você não conseguir descobrir algo mais específico, me avise. Mas também não tenho tempo para escrever um tutorial completo.
Você está certo - não há uma maneira óbvia e simples de fazê-lo (obrigado pelos links, acho que o revisitarei mais tarde.
Às vezes, será útil poder fazer 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:
A essência do arquivo Docker é https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 .
Isso funciona :-)
instale a goinsideferramenta de linha de comando com:
e entre em um contêiner de encaixe com um tamanho de terminal adequado com:
para mais detalhes, verifique isso .
Para bater em um contêiner em execução, digite o seguinte:
Porém, esta é a mesma resposta que @AdamKalnas
Apenas para informação. Se você precisar fazer login em um contêiner simples que não seja um daemon, use os seguintes comandos:
se o contêiner for parado como, por exemplo, um contêiner somente de dados, uma boa solução é executar um contêiner descartável toda vez que você desejar anexar ao contêiner de dados. Nesse caso, o próprio contêiner de dados poderia estar completamente vazio, pois o contêiner temporário teria as ferramentas do SO.