it-swarm.com.de

So erhalten Sie eine ssh-Verbindung mit Docker-Container unter OSX (boot2docker)

Ich verwende Docker unter OSX mit boot2docker .

Ich möchte eine Ssh-Verbindung von meinem Terminal in einen laufenden Container bekommen.

Aber ich kann das nicht :(

Ich denke es liegt daran, dass Docker in einer virtuellen Maschine läuft.

16
Valikos Ost

Es gibt mehrere Dinge, die Sie tun müssen, um das Ssh'ing für einen Container in einer VM zu aktivieren:

  1. installieren Sie und führen Sie sshd in Ihrem Container aus ( example ). sshd ist standardmäßig nicht vorhanden, da Container normalerweise nur einen Prozess ausführen, obwohl sie beliebig viele ausführen können.
  2. EXPOSE einen Port beim Erstellen des Images, normalerweise 22, so dass der Daemon beim Ausführen des Containers eine Verbindung zum EXPOSEd-Port im Container herstellt und etwas außerhalb des Containers verfügbar sein kann.
  3. Wenn Sie den Container ausführen, müssen Sie entscheiden, wie dieser Port zugeordnet werden soll. Sie können Docker das automatisch oder explizit machen lassen. Ich würde vorschlagen, explizit zu sein: docker run -p 42222:22 ..., der Port 42222 auf VM auf Port 22 im Container abbildet.
  4. Fügen Sie dem VM eine Portmap hinzu, um den Port für Ihren Host verfügbar zu machen. z.B. Wenn Ihr VM nicht aktiv ist, können Sie eine Zuordnung wie folgt hinzufügen: VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"

Dann sollten Sie von Ihrem Host aus ssh an Port 42222 auf dem Host senden können, um den ssh-Daemon des Containers zu erreichen.

Folgendes passiert, wenn ich die obigen Schritte durchführe:

$ 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 [email protected] -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.
[email protected]'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.

[email protected]:~# exit
logout

Das zeigt also ssh-> localhost 42222-> VM-Port 42222-> Containerport 22.

32
Andy

Docker hat den Befehl docker exec zu Docker 1.3.0 hinzugefügt. Sie können eine Verbindung zu einem laufenden Container folgendermaßen herstellen:

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

Dadurch wird eine Verbindung mit einer Bash-Eingabeaufforderung im laufenden Container hergestellt.

32
user848337

Wenn Sie nur in den laufenden Container einsteigen möchten, sollten Sie nsenter verwenden. Hier ist ein einfaches Bash-Skript ( vorgeschlagen von Chris Jones ), mit dem Sie einen Docker-Container eingeben können. Speichern Sie es irgendwo in Ihrem $PATH als Docker-Eingabe und 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
[email protected]
if[[ $# = 1 ]]; then
    args+=(/bin/bash)
fi

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

Dann können Sie docker-enter 89af3d (oder welche Konfiguration Sie eingeben möchten) ausführen.

1
Michael_Scharf

Ich habe dies für ein Ubuntu 16.04-Image getestet, das auf einem Host mit demselben Betriebssystem (Docker 18.09.2) ausgeführt wird. Mit geringfügigen Änderungen sollte es auch für boot2Docker funktionieren.

Bild erstellen. Führen Sie es im Hintergrund-Container aus (Ihr Benutzer kann root sein):

$ docker run -ditu <youruser> <imageId>

Mit einer Shell daran befestigen:

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

Installieren Sie den openssh-Server (Sudo wird nur benötigt, wenn Ihr Benutzer nicht root ist; der Befehl kann für boot2Docker abweichen):

$ Sudo apt-get install -y openssh-server

Starte es:

$ Sudo service ssh start

(Der folgende Schritt ist optional, wenn Ihr Benutzer ein Kennwort hat, können Sie es überspringen und das Kennwort bei jeder SSH-Verbindung eingeben.

Erstellen Sie einen RSA-Schlüssel auf dem Client-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.

Erstellen Sie auf dem Docker-Image ein Verzeichnis $HOME/.ssh:

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

Kopieren Sie den Inhalt von $HOME/.ssh/id_rsa.pub auf dem Clientcomputer an authorized_keys auf dem Docker-Image und speichern Sie die Datei.

(Ende des optionalen Schritts).

Notieren Sie die IP-Adresse Ihres Bildes:

$ 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

Jetzt sollte die Verbindung vom Client-Host wirksam sein:

$ 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

Natürlich können Sie das oben beschriebene Verfahren in Ihrer Docker-Datei nicht interaktiv anwenden.

0
PJ_Finnegan

Eine etwas modifizierte Variante von Michaels Antwort, bei der nur der Container, den Sie eingeben möchten, benannt wird (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 }')
0
Barrett Clark