wake-up-neo.com

Wie kann ich eine Remote-Verbindung zum Docker-Schwarm herstellen?

Ist es möglich, Befehle auf einem Docker-Schwarm-Cluster, der in der Cloud gehostet wird, von meinem lokalen Mac aus auszuführen? Wenn ja wie

Ich möchte einen Befehl wie den folgenden auf dem Docker-Schwarm von meinem lokalen ausführen:

docker create secret my-secret <address to local file>
docker service create --name x --secrets my-secret image
7
Navdeep

Antwort auf die Frage finden Sie hier .

Für Ubuntu-Computer müssen Sie die Datei daemon.json im Pfad /etc/docker mit folgendem Inhalt definieren:

  {
    "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
  }

Die obige Konfiguration ist nicht gesichert und sollte nicht verwendet werden, wenn der Server öffentlich gehostet ist.

Verwenden Sie für eine gesicherte Verbindung folgende Konfiguration:

{
  "tls": true,
  "tlscert": "/var/docker/server.pem",
  "tlskey": "/var/docker/serverkey.pem",
  "hosts": ["tcp://x.x.x.y:2376", "unix:///var/run/docker.sock"]
}

Details zum Generieren eines Zertifikats finden Sie hier wie von @BMitch erwähnt.

7
Navdeep

Um eine Verbindung zu einem Remote-Docker-Knoten herzustellen, müssen Sie TLS sowohl auf dem Docker-Host als auch auf dem Client einrichten, der von derselben Zertifizierungsstelle signiert ist. Achten Sie darauf, die Anzahl der Schlüssel, die Sie mit dieser Zertifizierungsstelle signieren, zu begrenzen, da diese den Zugriff auf den Docker-Host steuern.

Docker hat die Schritte zum Einrichten einer Zertifizierungsstelle und zum Erstellen/Installieren der Schlüssel hier dokumentiert: https://docs.docker.com/engine/security/https/

Nach der Konfiguration können Sie eine Verbindung zu den neueren Swarm-Modus-Umgebungen herstellen, indem Sie dieselben Docker-Befehle verwenden, die Sie lokal auf dem Docker-Host ausführen, indem Sie einfach den Wert von $ DOCKER_Host in Ihrer Shell ändern.

2
BMitch

Eine Option ist der direkte Zugriff auf den Docker-Daemon, wie in den vorherigen Antworten vorgeschlagen, jedoch müssen TLS-Zertifikate und -Schlüssel eingerichtet werden, was selbst knifflig und zeitraubend sein kann. Die Docker-Maschine kann diesen Prozess automatisieren, wenn die Knoten mit einer Docker-Maschine erstellt wurden.

Ich hatte das gleiche Problem, dass ich Geheimnisse auf dem Schwarm erstellen wollte, ohne die Datei mit dem Geheimnis in den Schwarmmanager hochzuladen. Außerdem wollte ich die Bereitstellungsstapeldatei (z. B. docker-compose.yml) ausführen können, ohne erst die Stapeldatei hochladen zu müssen. 

Ich wollte in der Lage sein, die wenigen Server zu erstellen, die ich z. DigitalOcean, das nicht unbedingt eine Docker-Maschine verwendet und in der Lage ist, die Geheimnisse reproduzierbar zu erstellen und die Stapeldatei auszuführen. In Umgebungen wie DigitalOcean und AWS wird kein separater Satz von TLS-Zertifikaten verwendet, sondern der ssh-Schlüssel auf dem lokalen Computer wird für den Zugriff auf den Remote-Knoten über ssh verwendet.

Die Lösung, die für mich funktionierte, bestand darin, die Docker-Befehle mit individuellen Befehlen über ssh auszuführen, wodurch ich die geheime Datei und/oder die Stapeldatei mit stdin pfeifen kann.

Dazu müssen Sie zuerst die DigitalOcean-Droplets erstellen und das Andockfenster darauf installieren, möglicherweise von einem benutzerdefinierten Image oder Snapshot, oder einfach die Befehle zum Installieren des Andockfensters für jedes Droplet ausführen. Fügen Sie dann die Tröpfchen zu einem Schwarm zusammen: ssh in den Knoten, der der Managerknoten sein soll. Geben Sie docker swarm init ein (möglicherweise mit der Option --advertise-addr, wenn sich auf diesem Knoten mehrere IP-Adressen befinden, z im privaten Netzwerk) und erhalten Sie den Join-Befehl für den Schwarm zurück. Dann ssh in jeden der anderen Knoten und geben Sie den Befehl join aus, und Ihr Schwarm wird erstellt.

Exportieren Sie dann den Befehl ssh, den Sie auf dem Manager-Knoten ausgeben müssen, z

export SSH_CMD='ssh [email protected]'

Nun haben Sie mehrere Möglichkeiten. Sie können einzelne Docker-Befehle wie folgt ausgeben:

$SSH_CMD docker service ls

Sie können ein Geheimnis in Ihrem Schwarm erstellen, ohne die geheime Datei in den Schwarmmanager zu kopieren:

$SSH_CMD docker create secret my-secret - < /path/to/local/file
$SSH_CMD docker service create --name x --secrets my-secret image

(Verwenden Sie -, um anzugeben, dass docker create secret das Geheimnis von stdin akzeptieren soll, und leiten Sie die Datei dann mit ssh an stdin.)

Sie können auch ein Skript erstellen, um reproduzierbar Befehle ausführen zu können, mit denen Sie Ihre Geheimnisse erstellen und Ihren Stapel mit geheimen Dateien und Stapeldateien nur auf Ihrem lokalen Computer starten können. Ein solches Skript könnte sein:

$SSH_CMD docker secret create rabbitmq.config.01 - < rabbitmq/rabbitmq.config
$SSH_CMD docker secret create enabled_plugins.01 - < rabbitmq/enabled_plugins
$SSH_CMD docker secret create rmq_cacert.pem.01 - < rabbitmq/cacert.pem
$SSH_CMD docker secret create rmq_cert.pem.01 - < rabbitmq/cert.pem
$SSH_CMD docker secret create rmq_key.pem.01 - < rabbitmq/key.pem
$SSH_CMD docker stack up -c - rabbitmq_stack < rabbitmq.yml

dabei werden die Geheimnisse für die Zertifikate und Schlüssel sowie für die Konfigurationsdateien rabbitmq.config und enabled_plugins verwendet. Die Stapeldatei ist rabbitmq.yml. Dies können folgende sein:

version: '3.1'
services:
  rabbitmq:
    image: rabbitmq
    secrets:
      - source: rabbitmq.config.01
        target: /etc/rabbitmq/rabbitmq.config
      - source: enabled_plugins.01
        target: /etc/rabbitmq/enabled_plugins
      - source: rmq_cacert.pem.01
        target: /run/secrets/rmq_cacert.pem
      - source: rmq_cert.pem.01
        target: /run/secrets/rmq_cert.pem
      - source: rmq_key.pem.01
        target: /run/secrets/rmq_key.pem
    ports: 
      # stomp, ssl:
      - 61614:61614
      # amqp, ssl:
      - 5671:5671
      # monitoring, ssl:
      - 15671:15671
      # monitoring, non ssl:
      - 15672:15672
  # nginx here is only to show another service in the stackfile
  nginx:
    image: nginx
    ports: 
      - 80:80
secrets:
  rabbitmq.config.01:
    external: true
  rmq_cacert.pem.01:
    external: true
  rmq_cert.pem.01:
    external: true
  rmq_key.pem.01:
    external: true
  enabled_plugins.01:
    external: true

(Hier richtet die Datei rabbitmq.config die ssh-Überwachungsports für stomp, amqp und die Überwachungsschnittstelle ein und weist rabbitmq an, nach den Zertifikaten und Schlüsseln in/run/secrets zu suchen. Eine andere Alternative für dieses spezielle Bild wäre die Verwendung von die Umgebungsvariablen, die vom Image bereitgestellt werden, um auf die Geheimdateien zu verweisen, aber ich wollte eine generischere Lösung, die keine Konfiguration im Image erfordert.

Wenn Sie nun einen weiteren Swarm aufrufen möchten, arbeitet Ihr Skript mit diesem Swarm, sobald Sie die Umgebungsvariable SSH_CMD festgelegt haben, und Sie müssen weder TLS einrichten noch Ihre geheimen Dateien oder Stapeldateien in das Swarm-Dateisystem kopieren.

Das löst also nicht das Problem der Erstellung des Schwarms (dessen Existenz von Ihrer Frage vorausgesetzt wurde), aber sobald er erstellt wurde, können Sie eine Umgebungsvariable (die exportiert wird, wenn Sie sie in Skripts verwenden möchten) fast verwenden genau die Befehle, die Sie aufgelistet haben und denen diese Umgebungsvariable vorangestellt ist.

1
nachbar

Wenn Sie bei Null anfangen, können Sie den Manager-Knoten mit einem generischen Docker-Machine-Treiber erstellen. Anschließend können Sie sich mit Hilfe des Befehls docker-machine env von Ihrem lokalen Computer aus mit dieser Docker-Engine verbinden.

0
andrey