J'utilise docker sur OSX avec boot2docker .
Je veux obtenir une connexion Ssh de mon terminal dans 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.
Il y a plusieurs choses à faire pour activer ssh sur un conteneur s'exécutant sur une machine virtuelle:
sshd
dans votre conteneur ( exemple ). sshd
n'y est pas par défaut car les conteneurs n'exécutent généralement qu'un processus, bien qu'ils puissent en exécuter autant que vous le souhaitez.EXPOSE
un port dans le cadre de la création de l'image, généralement 22, afin que, lorsque vous exécutez le conteneur, le démon se connecte au port EXPOSE
'd à l'intérieur du conteneur et que quelque chose puisse être exposé à l'extérieur du conteneur.docker run -p 42222:22 ...
qui mappe le port 42222 sur le VM sur le port 22 du conteneur.VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"
Ensuite, à partir de votre hôte, vous devriez être en mesure de ssh de porter le 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 indique donc ssh-> localhost 42222-> port VM 42222-> port conteneur 22.
Docker a ajouté la commande docker exec
à Docker 1.3.0. Vous pouvez vous connecter à un conteneur en cours d'exécution à l'aide des éléments suivants:
docker exec -it <container id> /bin/bash
Cela se connectera à une invite bash sur le conteneur en cours d'exécution.
Si vous souhaitez simplement entrer dans le conteneur en cours d'exécution, vous pouvez envisager d'utiliser nsenter
. Voici un script bash simple ( suggéré par Chris Jones ) que vous pouvez utiliser pour entrer dans un conteneur de menu fixe. Enregistrez-le quelque part dans votre $PATH
sous 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, vous pouvez exécuter docker-enter 89af3d
(ou la configuration que vous voulez entrer)
Une variante légèrement modifiée de la réponse de Michael qui nécessite simplement que le conteneur que vous souhaitez entrer soit nommée (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 }')