Ich versuche, mich mit Docker zu beschäftigen, um eine Anwendung bereitzustellen, die auf den Benutzern auf dem Desktop ausgeführt werden soll. Meine Anwendung ist einfach eine Flask-Webanwendung und eine Mongo-Datenbank. Normalerweise würde ich beide in einer VM installieren und einen Host-Port an die Gast-Web-App weiterleiten. Ich würde Docker gerne ausprobieren, bin mir aber nicht sicher, wie ich mehr als ein Programm verwenden soll. Die Dokumentation besagt, dass es nur ENTRYPOINT geben kann. Wie kann ich Mongo und meine Kolbenanwendung haben? Oder müssen sie sich in separaten Containern befinden. In diesem Fall, wie sprechen sie miteinander und wie erleichtert dies die Verteilung der App?
150
Antworten:
Es kann nur einen ENTRYPOINT geben, aber dieses Ziel ist normalerweise ein Skript, das so viele Programme startet, wie benötigt werden. Sie können beispielsweise beispielsweise Supervisord oder ähnliches verwenden, um mehrere Dienste in einem einzigen Container zu starten. Dies ist ein Beispiel für einen Docker-Container, in dem MySQL, Apache und WordPress in einem einzigen Container ausgeführt werden .
Angenommen, Sie haben eine Datenbank, die von einer einzelnen Webanwendung verwendet wird. Dann ist es wahrscheinlich einfacher, beide in einem einzigen Container auszuführen.
Wenn Sie eine gemeinsam genutzte Datenbank haben, die von mehr als einer Anwendung verwendet wird, ist es besser, die Datenbank in einem eigenen Container und die Anwendungen jeweils in einem eigenen Container auszuführen.
Es gibt mindestens zwei Möglichkeiten, wie die Anwendungen miteinander kommunizieren können, wenn sie in verschiedenen Containern ausgeführt werden:
quelle
Ich hatte eine ähnliche Anforderung, einen LAMP-Stack, Mongo DB und meine eigenen Dienste auszuführen
Docker ist eine betriebssystembasierte Virtualisierung, weshalb der Container um einen laufenden Prozess herum isoliert wird. Daher ist mindestens ein Prozess erforderlich, der in FOREGROUND ausgeführt wird.
Sie stellen also Ihr eigenes Startskript als Einstiegspunkt bereit, sodass Ihr Startskript zu einem erweiterten Docker-Image-Skript wird, in dem Sie eine beliebige Anzahl von Diensten stapeln können, bis MINDESTENS EIN VORDERER SERVICE gestartet ist, DER AUCH ZUM ENDE STEHT
Meine Docker-Bilddatei enthält also ganz unten zwei Zeilen:
In meinem Skript führe ich alle MySQL, MongoDB, Tomcat usw. aus. Am Ende führe ich meinen Apache als Vordergrund-Thread aus.
Auf diese Weise kann ich alle meine Dienste starten und den Container am Leben erhalten, wobei der zuletzt gestartete Dienst im Vordergrund steht
Ich hoffe es hilft
UPDATE : Seit ich diese Frage das letzte Mal beantwortet habe, sind neue Dinge wie Docker Compose aufgetaucht, mit denen Sie jeden Dienst in einem eigenen Container ausführen und dennoch alle als Abhängigkeiten zwischen diesen Diensten zusammenbinden können. Versuchen Sie, mehr über Docker-Compose und zu erfahren Verwenden Sie es, es ist eleganter, es sei denn, Ihr Bedarf passt nicht dazu.
quelle
Ich bin mit einigen früheren Lösungen, die empfohlen haben, beide Dienste im selben Container auszuführen, nicht einverstanden. In der Dokumentation wird klar angegeben, dass dies nicht empfohlen wird :
Es gibt gute Anwendungsfälle für Supervisord oder ähnliche Programme, aber das Ausführen einer Webanwendung + Datenbank ist nicht Teil davon.
Verwenden Sie dazu auf jeden Fall Docker-Compose und orchestrieren Sie mehrere Container mit unterschiedlichen Verantwortlichkeiten.
quelle
Sie können sich in separaten Containern befinden. Wenn die Anwendung auch in einer größeren Umgebung ausgeführt werden soll, ist dies wahrscheinlich der Fall.
Ein Multi-Container-System würde etwas mehr Orchestrierung erfordern, um alle erforderlichen Abhängigkeiten aufrufen zu können. In Docker v0.6.5 + gibt es jedoch eine neue Funktion, die bei der in Docker selbst integrierten Funktion hilft - das Verknüpfen . Bei einer Lösung mit mehreren Maschinen muss dies jedoch immer noch von außerhalb der Docker-Umgebung arrangiert werden.
Bei zwei verschiedenen Containern kommunizieren die beiden Teile weiterhin über TCP / IP. Wenn die Ports jedoch nicht speziell gesperrt wurden (nicht empfohlen, da Sie nicht mehr als eine Kopie ausführen können), müssen Sie den neuen Port übergeben dass die Datenbank in Bezug auf die Anwendung verfügbar gemacht wurde, damit sie mit Mongo kommunizieren kann. Dies ist wieder etwas, bei dem Linking helfen kann.
Für eine einfachere, kleine Installation, bei der sich alle Abhängigkeiten in demselben Container befinden, ist es auch möglich, dass sowohl die Datenbank als auch die Python-Laufzeit von dem Programm gestartet werden, das ursprünglich als ENTRYPOINT aufgerufen wird. Dies kann so einfach sein wie ein Shell-Skript oder ein anderer Prozess-Controller. Supervisord ist sehr beliebt, und in den öffentlichen Docker-Dateien gibt es eine Reihe von Beispielen.
quelle
Ich stimme den anderen Antworten zu, dass die Verwendung von zwei Containern vorzuziehen ist, aber wenn Sie es sich zum Ziel gesetzt haben, mehrere Dienste in einem einzigen Container zu bündeln, können Sie so etwas wie Supervisord verwenden.
In Hipache führt beispielsweise die enthaltene Docker-Datei Supervisord aus, und die Datei Supervisord.conf gibt an, dass sowohl Hipache als auch Redis-Server ausgeführt werden sollen.
quelle
Docker bietet einige Beispiele dafür. Die leichte Option ist:
quelle
Sie können 2 Prozesse im Vordergrund ausführen, indem Sie verwenden
wait
. Erstellen Sie einfach ein Bash-Skript mit dem folgenden Inhalt. ZBstart.sh
:Beginnen Sie in Ihrer Docker-Datei mit
quelle
Wenn ein dediziertes Skript zu viel Aufwand bedeutet, können Sie separate Prozesse explizit mit erzeugen
sh -c
. Beispielsweise:quelle