Question

J'utilise Docker sur OSX avec boot2docker.

Je souhaite obtenir une connexion Ssh de mon terminal vers un conteneur en cours d'exécution.

Mais je ne peux pas faire ça :(

Je pense que c'est parce que Docker s'exécute sur une machine virtuelle.

Était-ce utile?

La solution

Vous devez effectuer plusieurs opérations pour activer SSH sur un conteneur exécuté sur une VM :

  1. installer et exécuter sshd dans votre conteneur (exemple). sshd n'est pas là par défaut car les conteneurs n'exécutent généralement qu'un seul processus, bien qu'ils puissent en exécuter autant que vous le souhaitez.
  2. EXPOSE un port dans le cadre de la création de l'image, généralement 22, de sorte que lorsque vous exécutez le conteneur, le démon se connecte au EXPOSE'd port à l'intérieur du conteneur et quelque chose peut être exposé à l'extérieur du conteneur.
  3. Lorsque vous exécutez le conteneur, vous devez décider comment mapper ce port.Vous pouvez laisser Docker le faire automatiquement ou être explicite.Je suggère d'être explicite: docker run -p 42222:22 ... qui mappe le port 42222 sur la VM au port 22 dans le conteneur.
  4. Ajoutez un portmap à la VM pour exposer le port à votre hôte.par exemple.lorsque votre VM n'est pas en cours d'exécution, vous pouvez ajouter un mappage comme celui-ci : VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"

Ensuite, depuis votre hôte, vous devriez pouvoir accéder au port 42222 sur l'hôte pour atteindre le démon ssh du conteneur.

Voici ce qui se passe lorsque j'effectue les étapes ci-dessus :

$ 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

Cela montre donc ssh->localhost 42222->Port VM 42222->port de conteneur 22.

Autres conseils

Docker a ajouté la commande docker exec à Docker 1.3.0.Vous pouvez vous connecter à un conteneur en cours d'exécution en utilisant les éléments suivants:

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

qui se connectera à une invite de bash sur le conteneur en cours d'exécution.

Si vous souhaitez simplement accéder au conteneur en cours d'exécution, vous pouvez envisager d'utiliser nsenter.Voici un simple script bash (suggéré par Chris Jones) que vous pouvez utiliser pour entrer dans un conteneur Docker.Enregistrez-le quelque part dans votre $PATH comme docker-enter et 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[@]}"

Ensuite tu peux courir docker-enter 89af3d (ou quelle que soit la configuration que vous souhaitez saisir)

Une variante légèrement modifiée de la réponse de Michael qui nécessite simplement le conteneur que vous souhaitez saisir soit nommé (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 }')

J'ai testé cela pour une image Ubuntu 16.04 exécutée sur un hôte avec le même système d'exploitation, Docker 18.09.2, cela devrait également fonctionner pour boot2Docker avec des modifications mineures.

Construisez l’image.Exécutez-le dans le conteneur en arrière-plan (votreutilisateur peut être root):

$ docker run -ditu <youruser> <imageId>

Attachez-y avec une coque :

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

Installez le serveur openssh (sudo nécessaire uniquement si votre utilisateur n'est pas root, la commande peut différer pour boot2Docker) :

$ sudo apt-get install -y openssh-server

Exécuter:

$ sudo service ssh start

(L'étape suivante est facultative, si votre utilisateur dispose d'un mot de passe, vous pouvez l'ignorer et fournir le mot de passe à chaque connexion ssh).

Créez une clé RSA sur l'hôte client :

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

Sur l'image docker, créez un répertoire $HOME/.ssh:

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

Copiez et collez le contenu de $HOME/.ssh/id_rsa.pub sur la machine client pour authorized_keys sur l'image du docker et enregistrez le fichier.

(Fin de l'étape facultative).

Notez l'adresse IP de votre image :

$ 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

Maintenant, la connexion depuis l'hôte client devrait être effective :

$ 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

Bien sûr, vous pouvez appliquer la procédure ci-dessus de manière non interactive dans votre Dockerfile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top