2016-06-06 8 views
6

Ich brauche N Threads innerhalb eines Docker Container. Ich werde eine Liste von Elementen erhalten, dann teile ich sie in Blöcke und jeder Thread wird jeden Block verarbeiten.Mehrere Threads in Docker Container

Also verwende ich einen Docker Container mit einem Prozess und N Threads. Ist es eine gute Übung im Hafenarbeiter? Ich denke schon, weil wir z.B. einen Apacha-Webserver haben, der Verbindungen behandelt, die Threads erzeugen.

Oder es wird besser sein, N Container für jeden Brocken spawn? Wenn ja, was ist der richtige Weg?

Antwort

4

Ein Container als solcher hat nichts mit den Berechnungen zu tun, die Sie ausführen müssen. Die Frage, die Sie senden, ist , ob ich mehrere Prozesse haben soll, die meine Verarbeitung machen, oder mehrere Threads, die durch denselben Prozess erzeugt werden, der die Verarbeitung macht?

Ein Container ist nur eine Plattform für den Betrieb Ihrer Anwendung in der Umgebung, die Sie wollen. Zeitraum. Das bedeutet, Sie würden einen Prozess in einem Container ausführen, um Ihre Geschäftslogik auszuführen. Mehrere Container bedeutet einfach mehrere Prozesse und wie es ratsam ist, sollten Sie für mehrere Threads statt mehrere Prozesse gehen wie ein neuer Prozess (in Ihrem Fall, als Container) würde mehr Ressourcen auffressen und würde auch mehr Speicher usw. erfordern Es ist also besser, nur einen Container zu haben, der mehrere Threads hervorbringt, um die Aufgabe für Sie zu erledigen.

Es ist jedoch hängt auch von der Konfiguration der zugrunde liegenden Maschine, auf dem der Container gestartet wird. Wenn es aufgrund der Multicore-Fähigkeiten der zugrunde liegenden Hardware sinnvoll ist, mehrere Container mit mehreren Threads zu erstellen, sollten Sie dies ebenfalls tun.

3

Kurze Antwort:

Führen Sie Ihr Programm als ein einzigen Docker-Container. Stellen Sie sich einen Andock-Container als eine leicht isolierte Umgebung vor, ähnlich einer virtuellen Umgebung, in der Sie ein Programm/einen Dienst ausführen können. Dieser Dienst kann mehrere Threads ausführen, die alle vom übergeordneten Programm gestartet wurden - es ist immer noch ein Dienst, der auf einem einzelnen Andockcontainer ausgeführt wird.

Erläuterung:

Nehmen wir an, Sie ein Programm, das Themen laicht zu so etwas Arbeit - dieses Programm könnte einen Thread-Pool, einige Berechnung auf eine Reihe von Stücken zu tun, oder es könnte ein Web-Server sein, wie Apache. Es könnte sogar ein Python-Code sein, der einen Prozesspool instanziiert, um die Chunch-Berechnung durchzuführen. In all diesen Fällen gehören alle Threads und Prozesse zu einem Master-Prozess, der als ein einzelnes Programm oder Dienst betrachtet werden kann. Dieses einzelne Programm wird durch einen einzelnen Benutzerbefehl ausgelöst, den Sie in der DOCKER-Datei ENTRYPOINT eingeben.

Zum Beispiel können Sie einen Apache-Server-Container mit dem offiziellen Apache-Bild auf Docker Nabe docker hub ref) laufen:

docker run -dit --name my-apache-app -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4 

Und das wird den Apache-Web-Server als einen einzelnen Behälter, und zwar unabhängig davon, wie viele Threads laufen Es wird ausgeführt, auf das leicht zugegriffen werden kann, wenn der Bediener es mit den Andockbefehlen anhalten, neu starten, löschen usw. möchte. Und das ist bequemer, da wir uns keine Gedanken darüber machen müssen, wie Sie Volumina anhängen, Ports öffnen und eine Vielzahl von Containern miteinander verbinden, so dass sie miteinander kommunizieren.

Der Hauptpunkt ist also, dass Sie einen Container für jede Dienstinstanz erzeugen möchten. Wenn Sie beispielsweise doppelte Instanzen des übergeordneten Prozesses starten möchten. Führen Sie Apache auf zwei Computern als Teil einer Konfiguration mit Lastenausgleich aus, dann würden Sie zwei Container ausführen, einen auf jedem Host.

Außerdem, wenn Sie einen Anwendungsfall haben, wo Sie verschiedene Jobs im Batch-System ausführen mussten, wo jeder Job eine bestimmte Bibliotheken benötigt, dann würde diese Art von Anwendungsfall von der Umgebungsisolierung profitieren Das würde man erreichen, wenn man verschiedene Container fährt. Aber das ist nicht das, was Sie gefragt haben. Ihre Frage bezieht sich speziell auf einen Webserver, der Threads und Prozesse erzeugt, die Threads verwenden, um an Chunks zu arbeiten, und in diesen Fällen spawnen Sie einen einzelnen Container für den Service/das Programm.