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):
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
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:
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:
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)
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.
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:
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.