Pergunta

Eu uso janela de encaixe em OSX com boot2docker.

Eu quero ter uma conexão Ssh a partir de minha terminal para a execução de um recipiente.

Mas eu não posso fazer isso :(

Eu acho que é porque a janela de Encaixe está executando em uma máquina virtual.

Foi útil?

Solução

Há várias coisas que você deve fazer para ativar o ssh convites para um recipiente em execução em uma máquina virtual:

  1. instalar e executar o sshd em seu recipiente (exemplo). sshd não há porque, por padrão, recipientes normalmente executar apenas um processo, ainda que eles possam executar como muitos como você gosta.
  2. EXPOSE uma porta como parte da criação a imagem, normalmente 22, de modo que, quando você executar o recipiente, o daemon que liga para o EXPOSE'd porta dentro do recipiente e algo pode ser expostas no exterior do recipiente.
  3. Quando você executar o recipiente, você precisa decidir como mapear a porta.Você pode deixar a janela de Encaixe fazê-lo automaticamente ou ser explícito.Eu sugiro que ser explícito: docker run -p 42222:22 ... que mapeia a porta 42222 na VM para a porta 22 no recipiente.
  4. Adicionar um portmap para a máquina virtual para expor a porta para o seu host.exemplo:quando o VM não está em execução, você pode adicionar um mapeamento como este: VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"

Em seguida, a partir do seu host, você deve ser capaz de ligar-se por ssh à porta 42222 no host para alcançar o recipiente do daemon do ssh.

Aqui está o que acontece quando eu executar os passos acima:

$ VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"
$ ./boot2docker start
[2014-04-11 12:07:35] Starting boot2docker-vm...
[2014-04-11 12:07:55] Started.
$ docker run -d -p 42222:22 dhrp/sshd
Unable to find image 'dhrp/sshd' (tag: latest) locally
Pulling repository dhrp/sshd
2bbfe079a942: Download complete 
c8a2228805bc: Download complete 
8dbd9e392a96: Download complete 
11d214c1b26a: Download complete 
27cf78414709: Download complete 
b750fe79269d: Download complete 
cf7e766468fc: Download complete 
082189640622: Download complete 
fa822d12ee30: Download complete 
1522e919ec9f: Download complete 
fa594d99163a: Download complete 
1bd442970c79: Download complete 
0fda9de88c63: Download complete 
86e22a5fdce6: Download complete 
79d05cb13124: Download complete 
ac72e4b531bc: Download complete 
26e4b94e5a13b4bb924ef57548bb17ba03444ca003128092b5fbe344110f2e4c
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                   NAMES
26e4b94e5a13        dhrp/sshd:latest    /usr/sbin/sshd -D      6 seconds ago       Up 3 seconds        0.0.0.0:42222->22/tcp   loving_einstein     
$ ssh root@localhost -p 42222
The authenticity of host '[localhost]:42222 ([127.0.0.1]:42222)' can't be established.
RSA key fingerprint is ....
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:42222' (RSA) to the list of known hosts.
root@localhost's password: screencast
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.12.1-tinycore64 x86_64)

 * Documentation:  https://help.ubuntu.com/

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@26e4b94e5a13:~# exit
logout

Por isso que mostra o ssh->localhost 42222->VM porta 42222->porto de contentores 22.

Outras dicas

Docker foi adicionado a docker exec comando para a janela de Encaixe 1.3.0.Você pode ligar para a execução de um recipiente usando o seguinte:

docker exec -it <container id> /bin/bash

Que vai ligar para um prompt bash no recipiente.

Se você só quer ficar na execução do recipiente, você pode considerar o uso de nsenter.Aqui é um simples script bash (sugerido por Chris Jones) que você pode usar para entrar em uma janela de encaixe recipiente.Salve-o em algum lugar no seu $PATH como a janela de encaixe-entrar e chmod +x

#!/bin/bash
set-e
# Check for nsenter. If not found, install it
boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter'
# Use bash if no command is specified
args=$@
if[[ $# = 1 ]]; then
    args+=(/bin/bash)
fi

boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter "${args[@]}"

Em seguida, você pode executar docker-enter 89af3d (ou qualquer que seja a configuração que você deseja para entrar)

Um pouco modificada variante de Michael resposta que requer apenas o recipiente que você deseja inserir ser chamado (APPNAME):

boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter'

boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter $(docker ps | grep $APPNAME | awk '{ print $1 }')

Eu testei isso para um Ubuntu 16.04 imagem em execução em um host com o mesmo sistema operacional, a janela de Encaixe 18.09.2, ele também deve funcionar para boot2Docker com pequenas modificações.

Construir a imagem.Execute-a no fundo do recipiente (youruser pode ser root):

$ docker run -ditu <youruser> <imageId>

Anexar a ele com um shell:

$ docker exec -it <containerId> /bin/bash

Instalar o openssh-server (sudo só é necessário se o youruser não é root, o comando pode ser diferente para boot2Docker):

$ sudo apt-get install -y openssh-server

Executá-lo:

$ sudo service ssh start

(A etapa a seguir é opcional, se youruser tem uma senha, você pode ignorá-lo e fornecer a palavra-passe em cada conexão ssh).

Criar uma chave RSA no cliente host:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/youruser/.ssh/id_rsa.
Your public key has been saved in /home/youruser/.ssh/id_rsa.pub.

Na janela de encaixe imagem, crie um diretório $HOME/.ssh:

$ cd
$ mkdir .ssh && cd .ssh
$ vi authorized_keys

Copie e cole o conteúdo do $HOME/.ssh/id_rsa.pub na máquina do cliente para authorized_keys na janela de encaixe imagem e salve o arquivo.

(Fim da etapa opcional).

Anotar a sua imagem de endereço IP:

$ cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  63448863ac39
^^^^^^^^^^ this

Agora a conexão do host do cliente deve ser eficaz:

$ ssh 172.17.0.2
Enter passphrase for key '/home/youruser/.ssh/id_rsa': 
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-46-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Fri Apr  5 09:50:30 2019 from 172.17.0.1

É claro que você pode aplicar o procedimento acima não-interativamente na sua Dockerfile.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top