2016-04-05 33 views
1

Wir haben einen Teil unseres Systems auf eine mikroserviceorientierte Architektur umgestellt. Um dies auszuführen, haben wir entschieden, sie als Andock-Container auszuführen. Unsere Architektur ist im Moment wie folgt:Docker zu VM Networking

a) Mehrere Web-Server, Hosting der noch monolithischen PHP-Anwendung

b) 3 neue VMs, die

  • Ein laufen wird "Alarmierung" Micro
  • A mongo DB Instanz
  • Ein kundenspezifische Microregister (basierend auf redis)

Also, mein Problem ist wie folgt:

Unsere aktuelle Infrastruktur ist alles im Bereich 10.0.0.0/24. Docker spinnt Instanzen im Bereich 172.x.1.x. Wie bekomme ich die Web-Server (läuft unter 10.0.0.0/24), um eine Verbindung zu den Diensten herzustellen, die in der "Registrierung" registriert sind, zB 172.17.1.3?

Ich habe über viele Erweiterungen gelesen, wie Schwarm, komponieren, etc. Aber das scheint nicht das Netzwerkproblem zu lösen.

Sie könnten sagen: "Nun, Sie haben bereits den relevanten Port des Alerting-Dienstes verfügbar, verbinden Sie einfach mit der IP-Adresse dieser VM", aber das Problem ist, wenn der Dienst (dh die NodeJS-Anwendung im Docker-Container) startet oben registriert es seinen exponierten Port mit der Dienst- "Registrierung". Die Registrierung verwendet die anfragende IP-Adresse, um eine Art Pfad aufzubauen. Der Dienst wird gestartet und in der "Registrierung" als 172.17.1.5:3001 registriert. Wenn dies der einzige Weg ist, gibt es keine Möglichkeit, die Host IP-Adresse der Dienste zu erhalten?

Irgendwelche Vorschläge? Hoffe, das macht Sinn!

Danke für jede Hilfe!

Antwort

0

Die Registrierung verwendet die anfordernde IP-Adresse, um eine Art Pfad aufzubauen. Der Dienst wird gestartet und in der "Registrierung" als 172.17.1.5:3001 registriert. Wenn dies der einzige Weg ist, gibt es keine Möglichkeit, die Host-IP-Adresse der Dienste zu erhalten?

Wenn diese Container auf demselben Host ausgeführt wird (Lauf einer Docker-Daemon), Sie keine Registrierung benötigen, wie alle Container sich durch ein gemeinsame Docker Netzwerk sieht (die docker-compose creates by default in seiner Version 2)

Wenn diese Container auf verschiedenen Hosts ausgeführt werden (mit jeweils einem eigenen Docker-Dämon), benötigen Sie einen weiteren Schlüssel/Wert-Speicher, um die Sichtbarkeit des Docker-Containers in den VMs zu ermöglichen und einen Containernamen in die rechte IP-Adresse aufzulösen über Hosts hinweg.
Siehe "How to make Docker container accessible to other network machines through IP?" und this tutorial.

http://i.stack.imgur.com/ahLaf.png

Das Ihre redis Registry ersetzen könnte.

+0

Danke für Ihre Antwort! Ich könnte mich vertippt haben, ich wollte nicht, dass die Docker-Instanz registriert wird. Was ich meine ist, dass wenn sich die Anwendung, die in docker läuft, startet, registriert sie sich mit einer "microservice-Registrierung".Von anderen Clients kann ich einfach {registry IP}/find? Key = alerting aufrufen, und das gibt die IP und den Port zurück, wo der Client auf die "alarmierende" Anwendung zugreifen kann. Wenn das Sinn macht? Meine Frage wurde entsprechend aktualisiert. – iLikeBreakfast

+0

@iLikeBreakfast meine Antwort steht. Registry oder nicht, das Schlüsselelement hier ist: Wird Ihr Container innerhalb eines Docker-Daemons auf einem Rechner ausgeführt, oder laufen sie auf einem anderen Host, jeder mit einem eigenen Docker-Daemon? – VonC

+0

Ich würde sie gerne auf verschiedenen Daemons laufen. Ich denke, es wird leichter skalierbar sein, wenn wir das gerade jetzt machen. Also 3 Container, die auf 3 verschiedenen VMs laufen. Unabhängig davon, wie würde eine externe Anwendung eine Verbindung zum internen Containernetzwerk herstellen? Ist das überhaupt möglich? Hat '10.0.0.2' zum Beispiel eine Verbindung zum Container' 172.17.1.23'? – iLikeBreakfast

Verwandte Themen