GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So erstellen Sie eine Remote-VM mit dem generischen Docker-Machine-SSH-Treiber

Mit Docker können Sie Ihre Unternehmensanwendung in einen eigenständigen Container packen, der garantiert auf jedem läuft Umgebung.

Dies erleichtert sowohl Entwicklern als auch Systemadministratoren die Verwaltung der Anwendung. Wenn Sie ein Administrator sind, müssen Sie diese Ausrede von Entwicklern nicht mehr hören:„Aber es funktioniert in meiner Entwicklungsumgebung!“

Mit Docker Machine können Sie Docker Engine installieren und konfigurieren ein Remote-Server. Sobald Docker installiert ist, können Sie Docker von Ihrem lokalen Computer (Laptop) aus fernverwalten.

In diesem Tutorial sprechen wir speziell über den von Docker-Machine verwendeten generischen Treiber, der den SSH-Client verwendet, um den Remote-Docker-Host zu verwalten.

1. Dockeradmin-Benutzer auf Remote-Host erstellen

Erstellen Sie zunächst ein Linux-Benutzerkonto auf dem Remote-Server. Sie müssen nicht wirklich „dockeradmin“ als Benutzernamen verwenden, es kann alles sein. Sie können sogar Ihren eigenen Benutzernamen verwenden.

adduser dockeradmin

passwd dockeradmin

2. Generieren Sie ein öffentlich-privates SSH-Schlüsselpaar auf dem lokalen Host

Erstellen Sie als Nächstes auf Ihrem lokalen Host (Laptop) mit ssh-keygen einen öffentlichen und einen privaten SSH-Schlüssel. Sie sollten auch den privaten Schlüssel auf den Remote-Server kopieren.

Wie das geht, haben wir in diesem Artikel erklärt:Perform Remote SSH Login Without Password

Aber kurz gesagt, hier ist, was Sie dafür tun müssen:

ssh-keygen

ssh-copy-id dockeradmin@remote-server

Hinweis:Geben Sie während ssh-keygen keine Passphrase ein. Lassen Sie es leer.

3. Sudo-Zugriff für dockeradmin zulassen

Fügen Sie auf Ihrem Remote-Server in der Datei /etc/sudoers die folgende Zeile hinzu, die dem dockeradmin-Konto die volle sudo-Berechtigung erteilt. Das bedeutet, dass das Dockeradmin-Konto jeden Root-Befehl ausführen kann.

# visudo
dockeradmin     ALL=(ALL) NOPASSWD: ALL

Hinweis:Der Befehl visudo ändert die Datei /ec/sudoers. Sie müssen nicht „vi /etc/sudoers“ verwenden.

4. Externen Zugriff auf Remote-Server zulassen

Stellen Sie sicher, dass Ihr Remote-Server mit dem Internet kommunizieren kann. Dies ist erforderlich, da der Befehl docker-machine mehrere yum-Befehle aufruft, um bestimmte erforderliche Pakete zu installieren.

Stellen Sie also nur zu Testzwecken sicher, dass Folgendes auf Ihrem Server funktioniert.

ping google.com

Wenn Sie kein geeignetes Nameserver-Setup haben, ändern Sie Ihre /etc/resolve.conf und fügen Sie die folgende Zeile hinzu. Oder verwenden Sie einen der von Ihrem Systemadministrator bereitgestellten Nameserver.

# vi /etc/resolv.conf
nameserver 4.2.2.2

5. docker-machine Generische Treiberbefehlssyntax

Wenn Sie den generischen Treiber verwenden, sind die folgenden Optionen im Befehl docker-machine create verfügbar.

Die folgende Docker-Machine-Syntax zeigt alle obligatorischen Optionen:

docker-machine create -d generic --generic-ip-address {ip-address} {docker-vm-name}

In obiger Syntax:

  • docker-machine ist der Befehl
  • Create-Option weist Docker-Machine an, den Remote-Docker-VM-Host zu erstellen
  • Die Option
  • -d gibt an, welcher Treibertyp verwendet werden soll. Hier verwenden wir den „generischen“ Treiber, der den SSH-Client verwendet, um sich mit dem Remote-Host zu verbinden
  • –generic-ip-address gibt die Remote-IP-Adresse an, an der der docker-vm-Host erstellt werden soll.
  • docker-vm-name ist der Name, den Sie der Remote-docker-vm geben möchten, die durch den docker-machine-Befehl erstellt wird. Das kann alles sein.

Die folgende Docker-Machine-Syntax zeigt alle verfügbaren Optionen:

docker-machine create -d generic --generic-ip-address {ip-address} --generic-ssh-key {private-key} --generic-ssh-user {username} --generic-ssh-port {ssh-port} {docker-vm-name}

In obiger Syntax:

  • –generic-ssh-key Dies ist optional. Wenn Sie dies nicht angeben, kommuniziert es mit dem ssh-Agenten, der auf Ihrem lokalen System ausgeführt wird. Wenn Sie ssh-agent nicht auf Ihrem lokalen System (Laptop) ausführen, verwenden Sie diese Option und geben Sie den Speicherort Ihres privaten Schlüssels auf Ihrem lokalen System an.
  • –generic-ssh-user Dies ist optional. Standardmäßig wird root verwendet. In den meisten Situationen möchten Sie dies jedoch möglicherweise nicht tun. Geben Sie also den Benutzernamen an, den Docker-Machine verwenden soll, während er sich mit dem Remote-Host verbindet.
  • –generic-ssh-port Dies ist der SSH-Port des Remote-Servers. Standardmäßig ist dies 22.
  • Weitere Optionen werden in der obigen Syntax erklärt

6. Erstellen Sie den Remote-Docker-VM-Host

Jetzt ist es an der Zeit, den Docker-VM-Remotehost mit dem Befehl docker-machine create zu erstellen.

docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db

Das Folgende ist derselbe Befehl wie oben, aber ich habe ihn zur leichteren Lesbarkeit in mehrere Zeilen aufgeteilt.

docker-machine create -d generic \
  --generic-ip-address 192.168.100.2 \ 
  --generic-ssh-key $HOME/.ssh/id_rsa \
  --generic-ssh-user dockeradmin \
  --generic-ssh-port 22 \
  dev-db

Im obigen Befehl:

  • Wir haben alle Optionen im obigen Syntaxabschnitt erklärt.
  • 192.168.100.2 ist die IP-Adresse unseres Remote-Hosts, auf dem der docker-vm-Host erstellt werden soll.
  • $HOME/.ssh/id_rsa ist der private Schlüssel, der sich auf Ihrem lokalen System (Laptop) befindet
  • dockeradmin ist der Name des Linux-Benutzernamens auf dem Remote-Host
  • dev-db ist der Name, den ich dem Docker-VM-Host gegeben habe, den ich auf dem Remote-Host erstellen möchte. Das kann alles sein.

Hinweis:Auch hier führen Sie den obigen Docker-Machine-Befehl auf Ihrem lokalen System aus. Sie können den Docker-Machine-Befehl verwenden, der mit Ihrer Docker-Toolbox geliefert wurde.

7. Erfolgreiche Docker-Machine-Erstellungsausgabe

Wenn alles richtig funktioniert hat, sehen Sie die folgende Ausgabe des Befehls docker-machine create.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: C:\Program Files\Docker Toolbox\docker-machine.exe env dev-db

Wenn alles ordnungsgemäß funktioniert, sehen Sie schließlich den von uns erstellten Remote-Docker-VM-Host. Führen Sie auf Ihrem lokalen System Folgendes aus:

$ docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL  SWARM  DOCKER    ERRORS
default  *        virtualbox   Running   tcp://192.168.100.10:2376
dev-db   -        generic      Running   tcp://192.168.100.11:2376

Hinweis:Nun, zum größten Teil läuft nichts wie geplant, und Sie erhalten möglicherweise eine Fehlermeldung. Im Folgenden sind einige typische Probleme, mit denen ich konfrontiert war, und die Lösung dafür aufgeführt.

8. Fehler 1:Ungültiges Betriebssystem

Die aktuelle Version von Docker-Machine unterstützt nur bestimmte Betriebssystemversionen auf dem Remote-Server.

Wenn Ihr Remote-Server beispielsweise auf CentOS 6 läuft, erhalten Sie die folgende Fehlermeldung „/etc/os-release:No such file or directory“. Dies liegt daran, dass für CentOS nach CentOS 7 gesucht wird.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
(dev-db) Importing SSH key...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Error creating machine: Error detecting OS: Error getting SSH command: Something
 went wrong running an SSH command!
command : cat /etc/os-release
err     : exit status 1
output  : cat: /etc/os-release: No such file or directory

9. Fehler 2:Root-Befehl kann nicht ausgeführt werden (kein Sudo-Zugriff)

Wenn Sie nach der Zeile „Bereitstellung mit Centos…“ die Fehlermeldung „Fehler beim Erstellen des Computers:Fehler beim Ausführen der Bereitstellung:Status 1 beenden“ erhalten, liegt das nicht am Verbindungsproblem. Docker-Machine konnte sich ordnungsgemäß mit dem Remote-Server verbinden.

In diesem Fall ist es jedoch nicht möglich, den Root-Befehl als dockeradmin-Benutzer auszuführen. Verwenden Sie also visudo und erlauben Sie dem dockeradmin-Benutzer vollen sudo-Zugriff, wie wir es in einem der vorherigen Schritte erklärt haben.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Error creating machine: Error running provisioning: exit status 1

10. Fehler 3:netstat-Befehl fehlt

Wenn Sie nach der Zeile „Setting Docker configuration on the remote daemon…“ die Fehlermeldung „Error running SSH command:exit status 127“ erhalten, handelt es sich ebenfalls nicht um ein Verbindungsproblem.

In diesem Fall ist die Docker-Maschine mit dem Remote-SSH verbunden und hat den entsprechenden sudo-Zugriff, um den Root-Befehl auszuführen, aber einige der versuchten Befehle sind fehlgeschlagen, da der Befehl „netstat“ fehlt.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Error running SSH command: exit status 127
Error running SSH command: exit status 127
...
Error running SSH command: exit status 127
Error creating machine: Error running provisioning: Unable to verify the Docker
daemon is listening: Maximum number of retries (10) exceeded

Um dieses Problem zu beheben, installieren Sie das net-tools-Paket auf dem Remote-Server, das den „netstat“-Befehl enthält.

yum install net-tools

Ich hoffe, in der nächsten Version von Docker-Machine werden sie wahrscheinlich zu Beginn prüfen, ob „netstat“ auf dem Remote-Server vorhanden ist oder nicht, und eine entsprechende gültige Fehlermeldung ausgeben.

11. Fehler 4:Abweichung der Docker-Client-Version

Wenn Sie die folgende Fehlermeldung „Fehler beim Erstellen der Maschine:Fehler beim Ausführen der Bereitstellung:Status 1 beenden“ erhalten, besteht die Möglichkeit, dass der Docker-Client auf Ihrem lokalen System (Laptop) nicht mit dem Docker-Client auf dem Remote-System übereinstimmt.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Error creating machine: Error running provisioning: exit status 1

Zum Beispiel auf dem lokalen System:

$ docker version
Client:
 Version:      1.9.1

Auf Remote-Server:

# docker version
Client:
 Version:      1.8.2

Im obigen Beispiel ist die lokale Docker-Version 1.9.1, aber die entfernte Docker-Version ist eine ältere 1.8.2. Hier haben wir also eine Nichtübereinstimmung, und docker-machine create funktioniert nicht und schlägt wie oben gezeigt fehl.

Im obigen Szenario wurde die Docker-Engine separat auf dem Remote-Server installiert, der eine andere Docker-Client-Version hatte als die Docker-Client-Version, die mit der Docker-Maschine (Docker-Toolbox) auf dem lokalen System geliefert wurde.

Entfernen Sie in diesem Fall also den Docker wie unten gezeigt von Ihrem Remote-System.

# rpm -qa | grep docker
docker-selinux-1.8.2-10.el7.centos.x86_64
docker-1.8.2-10.el7.centos.x86_64

# rpm -ev docker-selinux
Preparing packages...
docker-selinux-1.8.2-10.el7.centos.x86_64

# rpm -ev docker
Preparing packages...
docker-1.8.2-10.el7.centos.x86_64

Wenn Sie jetzt den Docker-Machine-Befehl auf Ihrem lokalen System ausführen, wird automatisch die entsprechende Docker-Engine und der Docker-Client auf dem Remote-Server installiert, die mit dem Docker-Client auf dem lokalen Computer kompatibel sind.

12. Fehler 5:SELinux oder Firewall blockieren den Zugriff

Standardmäßig wird die neue Docker-VM-Maschine, die wir erstellt haben, auf TCP-Port 2376 ausgeführt.

Stellen Sie auf Ihrem Remote-Server sicher, dass Sie über eine geeignete Firewall-Regel verfügen, die den TCP-Port 2376 zulässt. Wenn Sie immer noch Probleme haben, schließen Sie vorübergehend die Möglichkeit aus, dass Firewalld den Zugriff blockiert, stoppen Sie Firewalld und sehen Sie, was passiert.

systemctl stop firewalld

Nochmals, nur zu Debugging-Zwecken, wenn Sie aus irgendeinem Grund die Firewall deaktivieren möchten, können Sie dies wie unten gezeigt tun:

systemctl disable firewalld

Die neueste Version von Docker funktioniert wunderbar mit SELinux, da gibt es keine Probleme. Aber in einer früheren Version von Docker gab es einige Fehler im Zusammenhang mit Docker und SELinux.

Wenn Sie also auf Probleme stoßen, versuchen Sie, SELinux vorübergehend zu deaktivieren, und prüfen Sie, ob das Problem dadurch behoben wird. Um SELinux dauerhaft zu deaktivieren, ändern Sie die Datei /etc/selinux/config entsprechend.

setenforce Permissive

getenforce

Beachten Sie außerdem, dass Docker-Machine die folgende Fehlermeldung „Fehler beim Warten auf SSH:Zu viele Wiederholungen beim Warten auf SSH“ anzeigt, wenn SSH keine Verbindung von Ihrem lokalen System zum Remote-Server herstellen kann. Um dies zu beheben, stellen Sie sicher, dass Sie die passwortlose SSH-Authentifizierung implementieren, wie in einem der obigen Schritte erläutert.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Error creating machine: Error waiting for SSH: Too many retries waiting for SSH
to be available.  Last error: Maximum number of retries (60) exceeded

Wenn alle oben genannten Probleme behoben sind, funktioniert docker-machine ohne Probleme wie unten gezeigt:

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db

$ docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL  SWARM  DOCKER    ERRORS
default  *        virtualbox   Running   tcp://192.168.100.10:2376
dev-db   -        generic      Running   tcp://192.168.100.11:2376

Linux
  1. So erstellen Sie einen Linux-Benutzer mit Ansible

  2. Ssh – Wie verbinde ich mich mit einem PC über einen anderen PC mit SSH?

  3. Wie kann man mit einem anderen Server per SSH auf einen Server zugreifen?

  4. So verbinden Sie einen Remote-Host mit dem ssh-Befehl

  5. Wie tunnelt man Windows Remote Desktop über ssh mit einer Linux-Box?

Wie richte ich eine passwortlose SSH-Anmeldung mit ssh-keygen ein?

So erstellen Sie eine SSH-Schlüssel-Passphrase unter Linux

So führen Sie eine Remote-Linux-Sicherung mit SSH durch

So verwenden Sie SSH, um eine Verbindung zu einem Remote-Server herzustellen

Gewusst wie:FreeBSD-Fernverwaltung

So erstellen Sie eine Partition mit dem Befehl „parted“